进程池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-----")

ultiprocessing.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()
# 使用阻塞模式创建进程,这样就不需要在reader中使用死循环了,可以让writer完全执行完成后,再用reader去读取
po.apply_async(writer, (q,)) time.sleep(1) # 先让上面的任务向Queue存入数据,然后再让下面的任务开始从中取数据 po.apply_async(reader, (q,))
po.close()
po.join()
print("(%s) End" % os.getpid())

最新文章

  1. swift-闭包(代码块)
  2. Search in Rotated Sorted Array
  3. LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8)
  4. String类的equals是如何进行字符串比较的
  5. JAVA开发错误总结(仅记录遇到的错误---后续不断更新......)
  6. LintCode Minimum Path Sum
  7. JavaScript中对象的比较
  8. QT 网络编程二(UDP版本)
  9. Ruby基本语法规则
  10. ajax讲解:“创建用户”和“用户登录”练习
  11. 看了这篇文章,Java编程速度我都惊呆了
  12. codeforces 430A Points and Segments (easy)(理解能力有待提高……)
  13. MT4平台上mql4实现的基于macd指标的智能交易EA
  14. if(男深圳集体户口&&女非深圳户口)深圳准生证办理材料及流程
  15. Latex 中插入图片no bounding box 解决方案
  16. R语言︱机器学习模型评估方案(以随机森林算法为例)
  17. An invalid character [32] was present in the Cookie value 错误
  18. MySQL中binlog参数:binlog_rows_query_log_events-记录具体的SQL【转】
  19. Apache ZooKeeper 服务启动源码解释
  20. Java知多少(93)鼠标事件

热门文章

  1. JAVA 没有重载运算符,那么 String 类型的加法是怎么实现的,以及String类型不可变的原因和好处
  2. leetcode141
  3. JEECG-Swagger UI的使用说明
  4. 一次sendmsg的改造过程
  5. Echarts 饼状图自定义颜色
  6. Windbg驱动双机调试环境配置
  7. netty(六) websocket开发应用
  8. The Moon and Sixpence摘抄
  9. input date 支持placeholder属性
  10. 异常解决 Unable to write generated Java files for schemas: null