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的类中动态添加属性与生成对象
Sep 17 Python
Python 基础之字符串string详解及实例
Apr 01 Python
回调函数的意义以及python实现实例
Jun 20 Python
python中的协程深入理解
Jun 10 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
python实现机器人卡牌
Oct 06 Python
python设置代理和添加镜像源的方法
Feb 14 Python
python实现飞船大战
Apr 24 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
Python根据字符串调用函数过程解析
Nov 05 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
Python实现列表拼接和去重的三种方式
Jul 02 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
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
python里 super类的工作原理详解
2019/06/19 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
男方父母婚礼答谢词
2014/01/25 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
个人收入证明格式
2015/06/24 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python