Python 单线程-多线程和多进程的效率对比测试(学到了)

多线程的目的 - “最大限度地利用cpu资源”。每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程。对于单cpu来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。由于时间片很短,这样给用户的感觉是同时有好多线程在执行。
python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(gil),在使用多线程(thread)的情况下,不能发挥多核的优势。而使用多进程(multiprocess),则可以发挥多核的优势真正地提高效率。
代码下载
单线程、多线程和多进程的效率对比测试:github地址
对比实验
资料显示,如果多线程的进程是cpu密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是io密集型,多线程进程可以利用io阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率
信息
详情
操作系统
windows 7 专业版 64-bit sp1
cpu
intel core i5 4590 @ 3.30ghz 4内核4线程
内存
8.00gb 单通道 ddr3 @ 798兆赫兹
硬盘
931gb seagate st1000dm003-1er162 ata device (sata)
过程展示(以cpu密集型操作为例)
单线程:进程1个(包含线程1个),cpu使用约24%
多线程:进程1个(包含线程11个),cpu使用约24%
多进程:进程11个(每个进程包含线程1个),cpu使用约100%
单线程.jpg
多线程.jpg
多进程.jpg
实验结果
cpu密集型操作
io密集型操作
网络请求密集型操作
线性操作
69.73533328374
17.76633326213
6.78833333651
多线程操作
75.40299995740
145.68366670609
1.93999997775
多进程操作
13.97433336576
4.67833328247
2.38333328565
总结
多线程:
由于gil的原因,4核的cpu最多能用到25%(1个核)
在cpu密集型的操作下明显地比单线程线性执行性能更差,在io密集型的操作下似乎也没有很大的优势(也许io操作的任务再繁重一些就能体现出优势),在网络请求密集型操作(阻塞线程的操作),多线程的优势便非常显著了
多进程:
无论是在cpu密集型还是io密集型以及网络请求密集型(经常发生线程阻塞的操作)中,都能体现出性能的优势。不过在类似网络请求密集型的操作上,与多线程相差无几,但却更占用cpu等资源,所以对于这种情况下,我们可以选择多线程来执行 程序员不是一天两天就能做成的,需要一份持续的心,多思考多变化。代码多敲就熟练了,不管天赋怎样,勤能补拙嘛,大家可以加我python交流群:58937142,里面新手资料,框架,爬虫。web都有,都是可以免费获取的,还有大牛解答各种难题,不失为是一个学习的好地方,小编在这里邀请大家加入我的大家庭。欢迎你的到来。
疑问
没搞明白为什么多线程的情况下, io密集型操作数据会相差那么大~~~