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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python中转换角度为弧度的radians()方法
May 18 Python
python生成器表达式和列表解析
Mar 10 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
详解Python中的分支和循环结构
Feb 11 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
用python对oracle进行简单性能测试
Dec 05 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
Django中celery的使用项目实例
Jul 07 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
桌面中心(四)数据显示
2006/10/09 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python中csv文件的若干读写方法小结
2018/07/04 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
python实现udp传输图片功能
2020/03/20 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
毕业生找工作的自我评价
2013/10/18 职场文书
环境工程大学生自荐信
2013/10/21 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
公司人力资源管理制度
2015/08/05 职场文书
机械生产实习心得体会
2016/01/22 职场文书
2019年大学推荐信
2019/06/24 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
分享3个非常实用的 Python 模块
2022/03/03 Python