为何说python的多线程是鸡肋?

0x01 论多线程的重要性java

多线程仍是有用的,多进程有多进程的好处,多线程有多线程的好处。多进程稳定,启动时开销大点,但若是你的运行时间远大于多进程的时间,用多进程比较方便,如postgresql用多进程,chrome 多进程。若是你只是想作个定时器样的简单东西,对稳定性要求低些,如vb,c#相似的定时器,用多线程吧,但线程的同步要注意了。python的线程更加相似定时器,python的线程不是真线程,但有的场合用这种定时器也能解决不少问题,由于开销小,开启也方便。进程和线程,一个是重量级的,一个轻量级的,重量级的进程有保护区,进程上下文都是操做系统保护的,而线程是本身管理,须要必定的技术,不能保证在并发时的稳定性(多进程也不稳定,但很容易看出来,由于多出了进程容易发现),而python的更像是定时器,定时器有时也能够模拟线程,定时器多时的开销比线程的开销要小,真线程有下上文开销,一个操做系统启动多进程和多线程会达到切换饱和是有数量的,真线程或进程太多都会致使cpu占用率居高不下,而定时器能够开n多。不少东西不是一种比另一种先进,而是一种互补的关系,计算机的计算单位切换有优势必有缺点,关键在找到合适的使用方式扬长避短。python

0x02 Python的多线程鸡肋web

简单地说就是做为多是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。UPDATE:如评论指出,Ruby也是有thread支持的,并且至少Ruby MRI是有GIL的。若是你的代码是CPU密集型,多个线程的代码颇有多是线性执行的。因此这种状况下多线程是鸡肋,效率可能还不如单线程由于有context switch可是:若是你的代码是IO密集型,多线程能够明显提升效率。sql

例如制做爬虫(我就不明白为何Python总和爬虫联系在一块儿…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其余线程能够继续执行。反过来说:你就不该该用Python写CPU密集型的代码…效率摆在那里…若是确实须要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,而且用pickle部分地实现了变量共享。再加一条,若是你不知道你的代码到底算CPU密集型仍是IO密集型,教你个方法:multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。
假设你使用的是multiprocessing的Pool,是使用多进程实现了chrome

concurrencyfrom multiprocessing import Pool

若是把这个代码改为下面这样,就变成多线程实现c#

concurrencyfrom multiprocessing.dummy import Pool

两种方式都跑一下,哪一个速度快用哪一个就好了。promise