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中import学习备忘笔记
Jan 24 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
python实现批量注册网站用户的示例
Feb 22 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
Python 列表反转显示的四种方法
Nov 16 Python
Python实现简单的俄罗斯方块游戏
Sep 25 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 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
mysq GBKl乱码
2006/11/28 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
Javascript的闭包详解
2014/12/26 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Django用户认证系统 User对象解析
2019/08/02 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
Python中Qslider控件实操详解
2021/02/20 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
AJax面试题
2014/11/25 面试题
岗位廉洁从政承诺书
2014/03/27 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
组织生活会发言材料
2014/12/15 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技