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 相关文章推荐
python3.3使用tkinter开发猜数字游戏示例
Mar 14 Python
python实现识别相似图片小结
Feb 22 Python
Python单链表简单实现代码
Apr 27 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
使用Flask集成bootstrap的方法
Jul 24 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
如何使用python包中的sched事件调度器
Apr 30 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
PHP similar_text 字符串的相似性比较函数
2010/05/26 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
原生js实现点击轮播切换图片
2020/02/11 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
css sprite简单实例
2016/05/23 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
2014年生产部工作总结
2014/12/17 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
医学会议开幕词
2016/03/03 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
mysql中关键词exists的用法实例详解
2022/06/10 MySQL