python学习记录——多线程与多进程

多线程multithreading(参考runnoob莫烦pythonpython-cookbook),具体上手使用可看看莫烦python。

       先说下自己的总结,自己是看了莫烦的视频,主要是关于怎么在python中添加多个线程,多个线程在python还是顺序执行的。因为python中的多线程解释器(这个解释器不太理解)并不是线程安全的——并行执行的话会产生冲突、错误,所以有一个全局解释器锁(GIL),确保任何时候都只有一个python线程执行。但是在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。

       我的问题是为什么输入、输出、文件读写多线程就会更有用,在计算密集型程序中多线程作用就很小?目前还不太明白,runnoob的优点总结算是给多线程指了一些用处吧,主要是用户界面,对这个还比较感兴趣,哈哈。

多线程类似于同时执行多个不同程序,多线程运行有如下优点:(--runnoob)

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

为什么是可能加快速度?(--python-cookbook)

        尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁(GIL)保护着,它确保任何时候都只有一个Python线程执行GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。

       在讨论普通的GIL之前,有一点要强调的是GIL只会影响到那些严重依赖CPU的程序(比如计算型的)。 如果你的程序大部分只会涉及到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。实际上,你完全可以放心的创建几千个Python线程, 现代操作系统运行这么多线程没有任何压力,没啥可担心的。

       还有一点要注意的是,线程不是专门用来优化性能的。我们有两种策略来解决GIL的缺点。 首先,如果你完全工作于Python环境中,你可以使用 multiprocessing 模块来创建一个进程池, 并像协同处理器一样的使用它。如果你使用其他工具访问C语言,比如对于Cython的ctypes库,你不需要做任何事。 例如,ctypes在调用C时会自动释放GIL。

多进程multiprocessing

 为什么要多进程?(莫烦)(这一部分还没看,只摘录一点)

        既然有了 threading, 为什么 Python 还要出一个 multiprocessing 呢? 原因很简单, 就是用来弥补 threading 的一些劣势, 比如在 threading 教程中提到的GIL.

        使用 multiprocessing 也非常简单, 如果对 threading 有一定了解的朋友, 你们的享受时间就到了. 因为 python 把 multiprocessing 和 threading 的使用方法做的几乎差不多. 这样我们就更容易上手. 也更容易发挥你电脑多核系统的威力了!

猜你喜欢

转载自blog.csdn.net/liuchengzimozigreat/article/details/85451147