python 进程池pool使用详解


Posted in Python onOctober 15, 2020

和选用线程池来关系多线程类似,当程序中设置到多进程编程时,Python 提供了更好的管理多个进程的方式,就是使用进程池。

在利用 Python 进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。

当被操作对象数目不大时,可以直接利用 multiprocessing 中的 Process 动态生成多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到 pool 中时,如果进程池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

Python multiprocessing 模块提供了 Pool() 函数,专门用来创建一个进程池,该函数的语法格式如下:

multiprocessing.Pool( processes )

其中,processes 参数用于指定该进程池中包含的进程数。

如果进程是 None,则默认使用 os.cpu_count() 返回的数字(根据本地的 cpu 个数决定,processes 小于等于本地的 cpu 个数)。

请看下面的实例:

from multiprocessing import Pool
import os
import time
import random

def worker(msg):
  t_start = time.time()
  print("%s开始执行,进程号为%d" % (msg, os.getpid()))
  # random.random()随机生成0~1之间的浮点数
  time.sleep(random.random()*2)
  t_stop = time.time()
  print(msg, "执行完毕,耗时%0.2f" % (t_stop-t_start))

if __name__ == "__main__":
  po = Pool(3) # 定义一个进程池,最大进程数3
  for i in range(0, 8):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker, (i,))

  print("----start----")
  # 关闭进程池,关闭后po不再接收新的请求
  po.close()
  # 等待po中所有子进程执行完成,必须放在close语句之后
  po.join()
  print("-----end-----")

运行结果:

python 进程池pool使用详解

multiprocessing.Pool 常用方法说明

apply_async(func[, args[, kwds]]) :使用非阻塞方式调用 func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args 为传递给 func 的参数列表,kwds 为传递给 func 的关键字参数列表。

close():关闭 Pool,使其不再接受新的任务。

terminate():不管任务是否完成,立即终止。

join():主进程阻塞,等待子进程的退出, 必须在 close 或 terminate 之后使用。

进程池中的 Queue

如果要使用 Pool 创建进程,就需要使用 multiprocessing.Manager() 中的 Queue(),而不是 multiprocessing.Queue(),否则会得到一条如下的错误信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

下面的实例演示了进程池中的进程如何通信:

from multiprocessing import Manager, Pool
import os
import time
import random

def writer(q):
  print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
  for i in "xiaoming":
    q.put(i)

def reader(q):
  print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
  for i in range(q.qsize()):
    print("reader从Queue获取到消息:%s" % q.get(True))

if __name__ == "__main__":
  print("(%s) start" % os.getpid())
  # 使用Manager中的Queue
  q = Manager().Queue()
  po = Pool()
  po.apply_async(writer, (q,))
  # 先让上面的任务向Queue存入数据,然后再让下面的任务开始从中取数据
  time.sleep(1)
  po.apply_async(reader, (q,))
  po.close()
  po.join()
  print("(%s) End" % os.getpid())

运行结果:

(17528) start
writer启动(2216),父进程为(17528)
reader启动(2216),父进程为(17528)
reader从Queue获取到消息:x
reader从Queue获取到消息:i
reader从Queue获取到消息:a
reader从Queue获取到消息:o
reader从Queue获取到消息:m
reader从Queue获取到消息:i
reader从Queue获取到消息:n
reader从Queue获取到消息:g
(17528) End

以上就是python 进程池pool使用详解的详细内容,更多关于python 进程池pool的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python中的深拷贝和浅拷贝详解
Jun 03 Python
win与linux系统中python requests 安装
Dec 04 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
pandas的object对象转时间对象的方法
Apr 11 Python
详解Python如何生成词云的方法
Jun 01 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
python实现简单多人聊天室
Dec 11 Python
python scp 批量同步文件的实现方法
Jan 03 Python
Django中间件基础用法详解
Jul 18 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 #Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 #Python
10款最佳Python开发工具推荐,每一款都是神器
Oct 15 #Python
matplotlib教程——强大的python作图工具库
Oct 15 #Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 #Python
详解pycharm配置python解释器的问题
Oct 15 #Python
详解查看Python解释器路径的两种方式
Oct 15 #Python
You might like
让PHP支持断点续传的源码
2010/05/16 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
javascript基本语法分析说明
2008/06/15 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
Vue指令指令大全
2019/02/09 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
Python常用正则表达式符号浅析
2014/08/13 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
对Python w和w+权限的区别详解
2019/01/23 Python
使用pandas读取文件的实现
2019/07/31 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
php优化查询foreach代码实例讲解
2021/03/24 PHP
葬礼主持词
2015/07/02 职场文书
2015年科普工作总结
2015/07/23 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
2019财务转正述职报告
2019/06/27 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python