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代码更快运行的5种方法
Jun 21 Python
在Django中使用Sitemap的方法讲解
Jul 22 Python
浅析Python数据处理
May 02 Python
Python 字符串与数字输出方法
Jul 16 Python
Flask框架各种常见装饰器示例
Jul 17 Python
python爬虫增加访问量的方法
Aug 22 Python
基于Python快速处理PDF表格数据
Jun 03 Python
用python获取txt文件中关键字的数量
Dec 24 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 Python
python如何读取.mtx文件
Apr 22 Python
Pytorch 如何加速Dataloader提升数据读取速度
May 28 Python
5行Python代码实现一键批量扣图
Jun 29 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/02/08 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
Windows下安装python2.7及科学计算套装
2015/03/05 Python
深入理解Javascript中的this关键字
2015/03/27 Python
python中的随机函数random的用法示例
2018/01/27 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
Django的Modelforms用法简介
2019/07/27 Python
python word转pdf代码实例
2019/08/16 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
什么是TCP/IP
2014/07/27 面试题
艺术系应届生的自我评价
2013/10/19 职场文书
家长会主持词
2014/03/26 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis