Python多进程适用的场景:计算密集型(CPU密集型)任务

Python多线程适用的场景:IO密集型任务

计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计算性能。

IO密集型任务一般指输入输出型,比如文件的读取,或者网络的请求,这类场景一般会遇到IO阻塞,使用多核CPU来执行并不会有太高的性能提升。

下面使用一台64核的虚拟机来执行任务,通过示例代码来区别它们,

示例1:执行计算密集型任务,进行1亿次运算

使用多进程

from multiprocessing import Process
import os, time# 计算密集型任务
def work():res = 0for i in range(100 * 100 * 100 * 100):  # 亿次运算res *= iif __name__ == "__main__":l = []print("本机为", os.cpu_count(), "核 CPU")  # 本机为64核start = time.time()for i in range(4):p = Process(target=work)  # 多进程l.append(p)p.start()for p in l:p.join()stop = time.time()print("计算密集型任务,多进程耗时 %s" % (stop - start))

使用多线程

from threading import Thread
import os, time# 计算密集型任务
def work():res = 0for i in range(100 * 100 * 100 * 100):  # 亿次运算res *= iif __name__ == "__main__":l = []print("本机为", os.cpu_count(), "核 CPU")  # 本机为64核start = time.time()for i in range(4):p = Thread(target=work)  # 多线程l.append(p)p.start()for p in l:p.join()stop = time.time()print("计算密集型任务,多线程耗时 %s" % (stop - start))

两段代码输出:

本机为 64 核 CPU
计算密集型任务,多进程耗时 6.864224672317505本机为 64 核 CPU
计算密集型任务,多线程耗时 37.91042113304138

说明:上述代码中,分别使用4个多进程和4个多线程去执行亿次运算,多进程耗时6.86s,多线程耗时37.91s,可见在计算密集型任务场景,使用多进程能大大提高效率。

另外,当分别使用8个多进程和8个多线程去执行亿次运算时,耗时差距更大,输出如下:

本机为 64 核 CPU
计算密集型任务,多进程耗时 6.811635971069336本机为 64 核 CPU
计算密集型任务,多线程耗时 113.53767895698547

可见在64核的cpu机器下,同时使用8个多进程和4个多进程效率几乎一样。而使用多线程则就效率较慢。要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数

示例2:400次,阻塞两秒,读取文件

使用多进程(4核cpu)

from multiprocessing import Process
import os, time# I/0密集型任务
def work():time.sleep(5)  # 阻塞两秒if __name__ == "__main__":l = []print("本机为", os.cpu_count(), "核 CPU")start = time.time()for i in range(1000):p = Process(target=work)  # 多进程l.append(p)p.start()for p in l:p.join()stop = time.time()print("I/0密集型任务,多进程耗时 %s" % (stop - start))

使用多线程(4核cpu)

from threading import Thread
import os, time# I/0密集型任务
def work():time.sleep(5)  # 阻塞两秒if __name__ == "__main__":l = []print("本机为", os.cpu_count(), "核 CPU")start = time.time()for i in range(1000):p = Thread(target=work)  # 多线程l.append(p)p.start()for p in l:p.join()stop = time.time()print("I/0密集型任务,多线程耗时 %s" % (stop - start))

输出:

本机为 64 核 CPU
I/0密集型任务,多进程耗时 12.28218412399292本机为 64 核 CPU
I/0密集型任务,多线程耗时 5.399136066436768

说明:python的多线程有于GIL锁的存在,无论是多少核的cpu机器,也只能使用单核,从输出结果来看,对于IO密集型任务使用多线程比较占优。

FAQ:执行多进程的io密集型任务时,报了一个错:

OSError: [Errno 24] Too many open files

原因:linux系统限制

ulimit -n
#  输出 1024

解决:(临时提高系统限制,重启后失效)

ulimit -n 10240

Python多进程和多线程的使用场景相关推荐

  1. 一文看懂Python多进程与多线程编程(工作学习面试必读)

    进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...

  2. python 多进程和多线程

    python 多进程和多线程 一.进程和线程 1.概念 进程: 一个进程就是一个任务,可以理解为一个程序.一个进程可以有多个线程,至少一个.多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影 ...

  3. 【干货】python多进程和多线程谁更快

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为G ...

  4. 多进程和多线程的使用场景

    多进程和多线程的使用场景 多进程模型的优势是CPU,多线程模型的优势是线程间切换代价较小 多线程模型适用于I/O密集型的工作场景,因此I/O密集型的工作场景经常会由于I/O阻塞导致频繁的切换线程.同时 ...

  5. 多进程、多线程的适用场景

    1.CPU密集型代码(各种循环处理.计数等等) 在这种情况下,ticks计数很快就会达到阈值,然后触发GIL的释放与再竞争(多个线程来回切换当然是需要消耗资源的),所以python下的多线程对CPU密 ...

  6. python多进程与多线程使用

    简介 关于多进程和多线程的详细介绍参考其他资料,这里仅列出一些显著特征,用于帮助实际使用时选择哪种方法. 多线程 多线程之间共享内存和变量: 创建线程总体资源消耗较低: 由于GIL锁,只能使用单核,性 ...

  7. python多进程和多线程看这一篇就够了

    脑海中关于进程和线程的概念一直很模糊,什么时候该用多进程,什么时候该用多线程总是搞不清楚.同时python因为历史遗留问题存在GIL全局锁,就让人更加困惑.这一篇就完整整理一下python中进程和线程 ...

  8. python多进程和多线程一起使用_Python干货:多进程与多线程!

    今天我们来聊聊Python里面的多进程与多线程编程模式. 01 多线程工作 在开始讲今天的正文之前,先给大家介绍一个概念「多线程工作」,这个概念可能有的人听过,也可能有的人平常工作中就是这么做的.我再 ...

  9. python多进程、多线程

    1.python多线程 使用一个例子来学习多线程.建议自己敲一遍. python多线程是通过threading模块的Thread实现. 创建线程对象 t = thread.Thread() 启动线程 ...

最新文章

  1. BZOJ 3626: [LNOI2014]LCA
  2. Android KeyCode列表
  3. python之路----递归函数(二分查找法)
  4. 三种常见的ps删除通道的操作
  5. 计算机专业初试,2019初试-计算机专业基础综合-考试大纲
  6. 使用easywechat调用微信支付
  7. 487计算机毕业设计
  8. 金融区块链标准规范解读
  9. 微信解除自定义表情150个上限?
  10. 认证抖音蓝V认证有什么好处?开通抖音企业号蓝V认证有什么权益优势?
  11. 随心,随性,随缘。注定让一生改变的,只在百年后,那一朵花开的时间…
  12. [附源码]Python计算机毕业设计大学生健康管理系统的设计与实现Django(程序+LW)
  13. 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
  14. Rosetta基础3:ligand docking
  15. 《HBase 不睡觉》第一章 - 初识 HBase
  16. VC++ Redistributable各版本对应的注册表键值
  17. C#系统托盘功能实现
  18. 详解http和https的作用与区别
  19. Java实现控制网口打印机并完成丢单重打机制
  20. 算法系列7《CVN》

热门文章

  1. odoo 邮件自动发送相关知识
  2. 程序、任务、进程和线程的联系与区别
  3. Matlab多项式和符号函数简介
  4. Hive-cli(hive)与Beeline的区别
  5. QT实现ping功能
  6. accept函数(TCP)
  7. NTFS分区结构及图片文档结构
  8. 计算机里的扫雷游戏,电脑扫雷游戏怎么玩
  9. 千锋教育+计算机四级网络-计算机网络学习-04
  10. Eclipse插件10