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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
在Python下进行UDP网络编程的教程
Apr 29 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
python实现超简单的视频对象提取功能
Jun 04 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
pytorch之添加BN的实现
Jan 06 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
python中update的基本使用方法详解
2019/07/17 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
2014新年寄语
2014/01/20 职场文书
自我推荐信格式模板
2015/03/24 职场文书
请客吃饭开场白
2015/06/01 职场文书