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返回昨天日期的方法
May 13 Python
Python实例一个类背后发生了什么
Feb 09 Python
Python使用爬虫猜密码
Feb 19 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
python 获取url中的参数列表实例
Dec 18 Python
python print出共轭复数的方法详解
Jun 25 Python
Python requests获取网页常用方法解析
Feb 20 Python
python实现简单坦克大战
Mar 27 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 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的Yii框架中登陆功能的实现
2015/08/21 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
React实现轮播效果
2020/08/25 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
Python的subprocess模块总结
2014/11/07 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
如何理解python面向对象编程
2020/06/01 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
专科毕业生自我鉴定
2013/12/01 职场文书
个人收入证明范本
2014/09/18 职场文书
单位介绍信格式
2015/01/31 职场文书
护士2015年终工作总结
2015/04/29 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL
Python之matplotlib绘制折线图
2022/04/13 Python