Python进程池Pool应用实例分析


Posted in Python onNovember 27, 2019

本文实例讲述了Python进程池Pool应用。分享给大家供大家参考,具体如下:

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务,请看下面的实例:

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, 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))
po = Pool(3) # 定义一个进程池,最大进程数3
for i in range(0,10):
  # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
  # 每次循环将会用空闲出来的子进程去调用目标
  po.apply_async(worker,(i,))
print("----start----")
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")

运行结果:

----start----
0开始执行,进程号为21466
1开始执行,进程号为21468
2开始执行,进程号为21467
0 执行完毕,耗时1.01
3开始执行,进程号为21466
2 执行完毕,耗时1.24
4开始执行,进程号为21467
3 执行完毕,耗时0.56
5开始执行,进程号为21466
1 执行完毕,耗时1.68
6开始执行,进程号为21468
4 执行完毕,耗时0.67
7开始执行,进程号为21467
5 执行完毕,耗时0.83
8开始执行,进程号为21466
6 执行完毕,耗时0.75
9开始执行,进程号为21468
7 执行完毕,耗时1.03
8 执行完毕,耗时1.05
9 执行完毕,耗时1.69
-----end-----

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.

下面的实例演示了进程池中的进程如何通信:

# -*- coding:utf-8 -*-
# 修改import中的Queue为Manager
from multiprocessing import Manager,Pool
import os,time,random
def reader(q):
  print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
  for i in range(q.qsize()):
    print("reader从Queue获取到消息:%s" % q.get(True))
def writer(q):
  print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
  for i in "itcast":
    q.put(i)
if __name__=="__main__":
  print("(%s) start" % os.getpid())
  q = Manager().Queue() # 使用Manager中的Queue
  po = Pool()
  po.apply_async(writer, (q,))
  time.sleep(1) # 先让上面的任务向Queue存入数据,然后再让下面的任务开始从中取数据
  po.apply_async(reader, (q,))
  po.close()
  po.join()
  print("(%s) End" % os.getpid())

运行结果:

(11095) start
writer启动(11097),父进程为(11095)
reader启动(11098),父进程为(11095)
reader从Queue获取到消息:i
reader从Queue获取到消息:t
reader从Queue获取到消息:c
reader从Queue获取到消息:a
reader从Queue获取到消息:s
reader从Queue获取到消息:t
(11095) End

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 不关闭控制台的实现方法
Oct 23 Python
python获取文件版本信息、公司名和产品名的方法
Oct 05 Python
python处理图片之PIL模块简单使用方法
May 11 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
python format 格式化输出方法
Jul 16 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
python 获取字典键值对的实现
Nov 12 Python
python基础入门之字典和集合
Jun 13 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 #Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 #Python
Python如何使用Gitlab API实现批量的合并分支
Nov 27 #Python
python [:3] 实现提取数组中的数
Nov 27 #Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 #Python
python中的数组赋值与拷贝的区别详解
Nov 26 #Python
使用python切片实现二维数组复制示例
Nov 26 #Python
You might like
php框架Phpbean说明
2008/01/10 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
用js的for循环获取radio选中的值
2013/10/21 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
人机交互程序 python实现人机对话
2017/11/14 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
Python wordcloud库安装方法总结
2020/12/31 Python
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
小学数学国培感言
2014/03/10 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
2014年环卫工作总结
2014/11/22 职场文书
拾金不昧表扬信
2015/01/16 职场文书
入党群众意见范文
2015/06/02 职场文书
教育教学读书笔记
2015/07/02 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
Python 键盘事件详解
2021/11/11 Python
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers