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类的多重继承问题深入分析
Nov 09 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
Python之数据序列化(json、pickle、shelve)详解
Aug 30 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
Python如何合并多个字典或映射
Jul 24 Python
Python使用shutil模块实现文件拷贝
Jul 31 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
Python collections模块使用方法详解
2019/08/28 Python
没编程基础可以学python吗
2020/06/17 Python
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
小学语文国培感言
2014/03/04 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
学校联谊协议书
2014/09/16 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
中标通知书
2015/04/17 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL