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多进程并发(multiprocessing)用法实例详解
Jun 02 Python
Python聚类算法之凝聚层次聚类实例分析
Nov 20 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
python3 线性回归验证方法
Jul 09 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
Python常见反爬虫机制解决方案
Jun 01 Python
Python如何输出整数
Jun 07 Python
python绘制趋势图的示例
Sep 17 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 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
PHPThumb图片处理实例
2014/05/03 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
JS碰撞运动实现方法详解
2016/12/15 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python实现快速多线程ping的方法
2015/07/15 Python
Python闭包函数定义与用法分析
2018/07/20 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
师生聚会感言
2014/01/26 职场文书
《湘夫人》教学反思
2014/02/21 职场文书
大学生工作自荐书
2014/06/16 职场文书
小学师德师风演讲稿
2014/09/02 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers