python 9.2 multiprocessing

来源:互联网 发布:js插件如何编写 编辑:程序博客网 时间:2024/05/16 03:26

之前用python的threading来进行多线程编程,对性能确实有提高。但似乎有点复杂,因为要维护一个工作队列,并且要注意死锁问题。python的threading和multiprocessing模块初探介绍了用threading创建多线程和multiprocessing创建多进程的基本方法。

python多线程的限制
python多线程有个讨厌的限制,全局解释器锁(global interpreter lock),也就是GIL。这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。手册上的解释是为了保证对象模型的正确性!这个锁造成的困扰是如果有一个计算密集型的线程占着cpu,其他的线程都得等着….,试想你的多个线程中有这么一个线程,得多悲剧,多线程生生被搞成串行;当然这个模块也不是毫无用处,手册上又说了:当用于IO密集型任务时,IO期间线程会释放解释器,这样别的线程就有机会使用解释器了!所以是否使用这个模块需要考虑面对的任务类型。

所以从上面的一段话就能知道为什么对python来说cpu密集型程序不适合多线程。

为什么有人说 Python 的多线程是鸡肋呢?
如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch

但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。

multiprocessing模块

python的multiprocessing模块是处理python多进程的模块,但multiprocessing模块中有个dummy的子模块。multiprocessing.dummy对多线程编程进行了包装。建立线程池变得简单,不用程序员自己来维护队列,

from multiprocessing import Pool as ThreadPoolpool = ThreadPool(pool_size)# pool_size is an integer which indicates the size of thread pool

这样简单一句话就建立了一个线程池。并且multiprocessing和multiprocessing.dummy都支持map并发(我不知道map并发什么意思,我理解成支持map操作)。Python 并行任务技巧讲的用multiprocessing.dummy来进行多线程编程,文章举例时用python爬虫,这里python爬虫不是cpu密集型的程序。在文章后面还介绍了cpu密集型程序并发时是用的multiprocessing模块,建立的是进程池,两个模块方法名很像,容易混淆。

multiprocessing是建立进程池,多进程;multiprocessing.dummy是建立线程池,多线程。

references & note:
* Python 并行任务技巧
* 进程、线程和协程的理解
* 使用Python进行并发编程
* python的threading和multiprocessing模块初探
* 为什么有人说 Python 的多线程是鸡肋呢?
* 用python爬虫抓站的一些技巧总结

0 0
原创粉丝点击