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之总结参数的传递
Oct 10 Python
Python使用Flask框架同时上传多个文件的方法
Mar 21 Python
初学Python函数的笔记整理
Apr 07 Python
python正则表达式的使用
Jun 12 Python
关于python的list相关知识(推荐)
Aug 30 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
在django中form的label和verbose name的区别说明
May 20 Python
Flask中sqlalchemy模块的实例用法
Aug 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
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
php生成验证码函数
2015/10/20 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
Python字符串处理实现单词反转
2017/06/14 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
鲜花方阵解说词
2014/02/13 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
高考寄语大全
2014/04/08 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
酒店开业主持词
2015/07/02 职场文书
奠基仪式致辞
2015/07/30 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs