和选用线程池来关系多线程类似,当程序中设置到多进程编程时,Python 提供了更好的管理多个进程的方式,就是使用进程池。

在利用 Python 进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。

当被操作对象数目不大时,可以直接利用 multiprocessing 中的 Process 动态生成多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到 pool 中时,如果进程池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

Python multiprocessing 模块提供了 Pool() 函数,专门用来创建一个进程池,该函数的语法格式如下:

multiprocessing.Pool( processes )

其中,processes 参数用于指定该进程池中包含的进程数。

如果进程是 None,则默认使用 os.cpu_count() 返回的数字(根据本地的 cpu 个数决定
,processes 小于等于本地的 cpu 个数)。

请看下面的实例:

from multiprocessing import Pool
import os
import time
import randomdef 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))if __name__ == "__main__":po = Pool(3) # 定义一个进程池,最大进程数3for i in range(0, 8):# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))# 每次循环将会用空闲出来的子进程去调用目标po.apply_async(worker, (i,))print("----start----")# 关闭进程池,关闭后po不再接收新的请求po.close()# 等待po中所有子进程执行完成,必须放在close语句之后po.join()print("-----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.

下面的实例演示了进程池中的进程如何通信:

from multiprocessing import Manager, Pool
import os
import time
import randomdef writer(q):print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))for i in "xiaoming":q.put(i)def reader(q):print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))for i in range(q.qsize()):print("reader从Queue获取到消息:%s" % q.get(True))if __name__ == "__main__":print("(%s) start" % os.getpid())# 使用Manager中的Queueq = Manager().Queue()po = Pool()po.apply_async(writer, (q,))# 先让上面的任务向Queue存入数据,然后再让下面的任务开始从中取数据time.sleep(1)po.apply_async(reader, (q,))po.close()po.join()print("(%s) End" % os.getpid())

运行结果:

(17528) start
writer启动(2216),父进程为(17528)
reader启动(2216),父进程为(17528)
reader从Queue获取到消息:x
reader从Queue获取到消息:i
reader从Queue获取到消息:a
reader从Queue获取到消息:o
reader从Queue获取到消息:m
reader从Queue获取到消息:i
reader从Queue获取到消息:n
reader从Queue获取到消息:g
(17528) End

python 进程池pool使用详解相关推荐

  1. python 进程池不足,解决Python 进程池Pool中一些坑

    1 from multiprocessing import Pool,Queue. 其中Queue在Pool中不起作用,具体原因未明. 解决方案: 如果要用Pool创建进程,就需要使用multipro ...

  2. Python进程池Pool的使用

    1.进程池Pool 需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到m ...

  3. python 进程池pool简单实例

    进程池: 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Pr ...

  4. Python 多进程 multiprocessing.Pool类详解

    multiprocessing模块 multiprocessing包是Python中的多进程管理包.它与 threading.Thread类似,可以利用multiprocessing.Process对 ...

  5. Python进程池Pool:让每个进程井然有序

    文章目录 初步使用 apply_async map_async `close`.`terminate`和`join` 如果疯狂地弹进程,很容易导致内存爆炸,所以非常有必要设计一种功能,可以限定同时运行 ...

  6. Python进程池Pool、进程池通信

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  7. python进程池调用实例方法_Python进程池Pool应用实例分析

    本文实例讲述了Python进程池Pool应用.分享给大家供大家参考,具体如下: 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百 ...

  8. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法

    apply函数主要用于传递不定参数,主进程会被阻塞到函数执行结束.也就是说只有apply里面的内容被执行完了,才会进行执行主函数的内容. 参考文章1:python进程池Pool的apply与apply ...

  9. Python 进程池 multiprocessing.Pool - Python零基础入门教程

    目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...

最新文章

  1. 上下定高 中间自适应_移动端布局上下固定中间自适应
  2. Error:NgdBuild:604解决方法(添加NGC文件方法)
  3. Android的内存优化的几种方案
  4. postman发送object_.NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部...
  5. pymc3 贝叶斯线性回归_使用PyMC3估计的贝叶斯推理能力
  6. 又拍云 php5月18号那,又拍云文档中心
  7. python--*args和**kwargs可变参数
  8. 文件上传~Uploadify上传控件~续(多文件上传)
  9. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理
  10. 【股价预测】基于matlab最小二乘法股票价格预测【含Matlab源码 348期】
  11. 我的华为云售后日常(一)
  12. 台式电脑投影切屏快捷键_电脑投影切屏快捷键
  13. 安装SVN后,更新项目没有对号等图标
  14. R语言 生存分析与cox模型的学习笔记
  15. allegro出光绘文件出现的几个问题
  16. 自棱镜事件,隐私保护搜索引擎DuckDuckGo流量增长600%
  17. 计算机 上的图片怎样加密码,电脑照片文件怎么加密?电脑文件加密软件介绍...
  18. MATLAB绘制海面风场图像(海面风场反演)
  19. java default locale_Java Locale setDefault()用法及代码示例
  20. Gnuplot 常用命令

热门文章

  1. 百度文字识别官方Demo
  2. 从零搭建Spring Boot脚手架(2):增加通用的功能(转载)
  3. 最新--2018下半年Android面试历程(转载)
  4. Java Rasp技术浅析
  5. [Eigen]Eigen的单位矩阵C++
  6. pve远程连接 spcie_惠普 SL250s Gen8 服务器编译PVE内核通过禁用RMRR来实现pcie直通
  7. 计算机必须设置默认打印机,win10系统禁止更改默认打印机设置的还原技巧
  8. 片上总线Wishbone 学习(一)片上总线综述
  9. 人生苦短python作伴_人生苦短,我用python
  10. C - Fewest Flops