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读取html中指定元素生成excle文件示例
Apr 03 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
Python性能提升之延迟初始化
Dec 04 Python
python导入时小括号大作用
Jan 10 Python
python机器学习实战之树回归详解
Dec 20 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
python3实现常见的排序算法(示例代码)
Jul 04 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
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
国贸专业个人求职信分享
2013/12/04 职场文书
个人作风剖析材料
2014/02/02 职场文书
开学季活动策划方案
2014/02/28 职场文书
公司经理任命书
2014/06/05 职场文书
会计学专业自荐信
2014/06/25 职场文书
新店开张活动方案
2014/08/24 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
村委会贫困证明范文
2014/09/21 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python