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使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
Python 自动化表单提交实例代码
Jun 08 Python
深入浅出学习python装饰器
Sep 29 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
查看python下OpenCV版本的方法
Aug 03 Python
Python+pyplot绘制带文本标注的柱状图方法
Jul 08 Python
Django中URL的参数传递的实现
Aug 04 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
python调用API接口实现登陆短信验证
May 10 Python
Python中常用的os操作汇总
Nov 05 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中的时间处理
2006/10/09 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
php实现aes加密类分享
2014/02/16 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
详解PHP队列的实现
2019/03/14 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
javascript innerText和innerHtml应用
2010/01/28 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
python从入门到精通(DAY 3)
2015/12/20 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
python简单商城购物车实例代码
2018/03/15 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
通信工程毕业生自荐信
2013/11/01 职场文书
农救科工作职责
2013/11/27 职场文书
高二生物教学反思
2014/01/27 职场文书
《争吵》教学反思
2014/02/15 职场文书
学习标兵获奖感言
2014/02/20 职场文书
财务主管岗位职责
2014/02/28 职场文书
紧急通知
2015/04/17 职场文书