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 相关文章推荐
Django内容增加富文本功能的实例
Oct 17 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Python列表的切片实例讲解
Aug 20 Python
Python flask框架端口失效解决方案
Jun 04 Python
新手学python应该下哪个版本
Jun 11 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 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图片验证码代码
2008/03/27 PHP
有关php运算符的知识大全
2011/11/03 PHP
基于php-fpm的配置详解
2013/06/03 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
Vue框架之goods组件开发详解
2018/01/25 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
python实现TF-IDF算法解析
2018/01/02 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
python异常处理和日志处理方式
2019/12/24 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
普天C++笔试题
2016/03/20 面试题
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
商务宴会祝酒词
2015/08/11 职场文书
MySQL视图概念以及相关应用
2022/04/19 MySQL