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 21 Python
python类参数self使用示例
Feb 17 Python
Djang中静态文件配置方法
Jul 30 Python
python实现归并排序算法
Nov 22 Python
python flask解析json数据不完整的解决方法
May 26 Python
在python里面运用多继承方法详解
Jul 01 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
python如何爬取动态网站
Sep 09 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
Python获取字典中某个key的value
Apr 13 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
JavaScript Split()方法
2015/12/18 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
解决uWSGI的编码问题详解
2017/03/24 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
电子商务专业个人的自我评价分享
2013/10/29 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
篮球社团活动总结
2014/06/27 职场文书
2014年营销工作总结
2014/11/22 职场文书
出生证明范本
2015/06/15 职场文书
团结友爱主题班会
2015/08/13 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
详解Laravel制作API接口
2021/05/31 PHP
浅谈如何保证Mysql主从一致
2022/03/13 MySQL