多线程的目的 - “最大限度地利用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%
实验结果
| 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等资源,所以对于这种情况下,我们可以选择多线程来执行
疑问
- 没搞明白为什么多线程的情况下, IO密集型操作数据会相差那么大~~~
(占位---待继续更新)
参考文章
仅个人观点,,欢迎留言~~~