美文网首页python爬虫日记本Python数据采集与爬虫scrape
Python高阶(一) - 单线程、多线程和多进程的效率对比测试

Python高阶(一) - 单线程、多线程和多进程的效率对比测试

作者: Spareribs | 来源:发表于2017-07-04 20:34 被阅读308次

    多线程的目的 - “最大限度地利用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%


      单线程.jpg
    • 多线程:进程1个(包含线程11个),CPU使用约24%


      多线程.jpg
    • 多进程:进程11个(每个进程包含线程1个),CPU使用约100%


      多进程.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等资源,所以对于这种情况下,我们可以选择多线程来执行

    疑问

    • 没搞明白为什么多线程的情况下, IO密集型操作数据会相差那么大~~~
      (占位---待继续更新)

    参考文章

    仅个人观点,,欢迎留言~~~

    相关文章

      网友评论

        本文标题:Python高阶(一) - 单线程、多线程和多进程的效率对比测试

        本文链接:https://www.haomeiwen.com/subject/hjixhxtx.html