https://zhuanlan.zhihu.com/p/46368084

利用multiprocess模块的Pool类创建多进程

很多时候系统都需要创建多个进程以提高CPU的利用率,当数量较少时,可以手动生成一个个Process实例。当进程数量很多时,或许可以利用循环,但是这需要程序员手动管理系统中并发进程的数量,有时会很麻烦。这时进程池Pool就可以发挥其功效了。可以通过传递参数限制并发进程的数量,默认值为CPU的核数。

Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果进程池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。

下面介绍一下multiprocessing 模块下的Pool类的几个方法:

1.apply_async

函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])

其作用是向进程池提交需要执行的函数及参数, 各个进程采用非阻塞(异步)的调用方式,即每个子进程只管运行自己的,不管其它进程是否已经完成。这是默认方式。

2.map()

函数原型:map(func, iterable[, chunksize=None])

Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回。 注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

3.map_async()

函数原型:map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的。其有关事项见apply_async。

4.close()

关闭进程池(pool),使其不在接受新的任务。

  1. terminate()

结束工作进程,不在处理未处理的任务。

6.join()

主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。

下例是一个简单的multiprocessing.Pool类的实例。因为小编我的CPU是4核的,一次最多可以同时运行4个进程,所以我开启了一个容量为4的进程池。4个进程需要计算5次,你可以想象4个进程并行4次计算任务后,还剩一次计算任务(任务4)没有完成,系统会等待4个进程完成后重新安排一个进程来计算。

from multiprocessing import Pool, cpu_count
import os
import timedef long_time_task(i):print('子进程: {} - 任务{}'.format(os.getpid(), i))time.sleep(2)print("结果: {}".format(8 ** 20))if __name__=='__main__':print("CPU内核数:{}".format(cpu_count()))print('当前母进程: {}'.format(os.getpid()))start = time.time()p = Pool(4)for i in range(5):p.apply_async(long_time_task, args=(i,))print('等待所有子进程完成。')p.close()p.join()end = time.time()print("总共用时{}秒".format((end - start)))

知识点:

  • 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close()或terminate()方法,让其不再接受新的Process了。

CPU内核数:4
当前母进程: 2556
等待所有子进程完成。
子进程: 16480 - 任务0
子进程: 15216 - 任务1
子进程: 15764 - 任务2
子进程: 10176 - 任务3
结果: 1152921504606846976
结果: 1152921504606846976
子进程: 15216 - 任务4
结果: 1152921504606846976
结果: 1152921504606846976
结果: 1152921504606846976
总共用时4.377134561538696秒

Python多进程和多线程哪个快?

由于GIL的存在,很多人认为Python多进程编程更快,针对多核CPU,理论上来说也是采用多进程更能有效利用资源。网上很多人已做过比较,我直接告诉你结论吧。

对CPU密集型代码(比如循环计算) - 多进程效率更高
对IO密集型代码(比如文件操作,网络爬虫) - 多线程效率更高。

Python多进程与多线程编程相关推荐

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

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

  2. Python多进程、多线程编程

    文章目录 1. 进程.线程.协程 2. Python多线程 GIL全局解释器锁 CPython科普 3. Python:多进程 or 多线程 计算密集型.I/O密集型科普 4. 编程实战 1. 进程. ...

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

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

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

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

  5. python 多进程和多线程

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

  6. Python实战之多线程编程thread模块

    Python实战之多线程编程thread模块 在Python中除了可以通过继承threading.Thread类来实现多线程外,也可以调用thread模块中的start_new_thread()函数来 ...

  7. Python实战之多线程编程threading.Thread

    Python实战之多线程编程threading.Thread 在Python中可以使用继承threading.Thread类来实现多线程编程,其中子类可以重写父类的__init__和run方法来实现用 ...

  8. python学习笔记——多线程编程

    python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...

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

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

  10. Python多进程和多线程的使用场景

    Python多进程适用的场景:计算密集型(CPU密集型)任务 Python多线程适用的场景:IO密集型任务 计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计 ...

最新文章

  1. 使用 AjaxManager 生成调用服务器端方法的 javascript 函数
  2. NYOJ 970 Yougth's Game II
  3. 【Python】5种基本但功能非常强大的可视化类型
  4. 李青源:高清体验和带宽节省,瞄准方向深耕
  5. C语言extern的用法
  6. 从UnitedStack OS 1.0 Preview试用申请问卷调查学习OpenStack
  7. svn is already locked
  8. c语言i o编程,【linux】基本I/O操作标准I/O操作(c语言编程)
  9. Codeforces Round #372 (Div. 1) B. Complete The Graph
  10. 阅读SSM项目之scm
  11. 分数计算机在线应用,在线连分数计算器
  12. 移动直播元年:内容单一,80%流量靠网红主播
  13. 极客时间_week03_work
  14. 浅谈2019互联网新技术
  15. Linux下配置网卡信息
  16. Cesium,ClippingPlanes,任意剪裁面对3DTiles剪裁
  17. Minio的mc工具使用
  18. 攻防世界 unfinish
  19. 23.生产与消费模型
  20. c语言计算机二级常用库函数,计算机二级office,excle最难,这里为大家列出常见函数,附题库-计算机二级office题库...

热门文章

  1. EMNLP2020文档级关系抽取模型GLRE 论文Global-to-Local Neural Networks for Document-Level Relation Extraction
  2. jQuery-zTree插件使用
  3. Flutter之播放视频
  4. html页面div等分,HTML5使用纯CSS实现“按比例平分”整个垂直空间
  5. php 松散耦合,PHP依赖注入和松散耦合
  6. python实现判断一个整数是否是回文数
  7. java dao接口_java web项目中dao和service前面为什么要有接口呢??
  8. mysql会话杀不掉_SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析
  9. python创建类mymath_构建DLL(MyMathFuncs)以在Python Ctypes中使用
  10. mysql prefix_批量修改MySQL表前缀