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

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务,请看下面的实例:

import multiprocessing

import time

import os

import random

def test1(msg):

t_start=time.time()

print("%s开始执行,进程号为%d" %(msg, os.getpid()))

time.sleep(1)

t_stop=time.time()

print("%s执行完成,耗时%.2f" % (msg, t_stop -t_start))if __name__ == "__main__":

po= multiprocessing.Pool(3)for i in range(0, 10):

# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))

# 每次循环将会用空闲出来的子进程去调用目标

po.apply_async(test1, (i,))

print("-----start-----")

po.close() # 关闭进程池,关闭后po不再接收新的请求

po.join() # 等待po中所有子进程执行完成,必须放在close语句之后

print("-----end-----")

outputs

macname@MacdeMacBook-Pro py %python3 cccccc.py-----start-----0开始执行,进程号为54293

1开始执行,进程号为54294

2开始执行,进程号为54295

0执行完成,耗时1.001执行完成,耗时1.002执行完成,耗时1.003开始执行,进程号为54295

4开始执行,进程号为54294

5开始执行,进程号为54293

3执行完成,耗时1.006开始执行,进程号为54295

5执行完成,耗时1.004执行完成,耗时1.007开始执行,进程号为54293

8开始执行,进程号为54294

8执行完成,耗时1.006执行完成,耗时1.007执行完成,耗时1.009开始执行,进程号为54293

9执行完成,耗时1.00

-----end-----macname@MacdeMacBook-Pro py %

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.

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

import time

def write(q):

print("write启动(%s),父进程为(%s)" %(os.getpid(), os.getppid()))for i in "python":

q.put(i)

def read(q):

print("read启动(%s),父进程为(%s)" %(os.getpid(), os.getppid()))for i inrange(q.qsize()):

print("read从Queue获取到消息:%s" % q.get(True))if __name__ == "__main__":

print("(%s) start" %os.getpid())

q=multiprocessing.Manager().Queue()

po=multiprocessing.Pool()

po.apply_async(write, args=(q,))

time.sleep(2)

po.apply_async(read, args=(q,))

po.close()

po.join()

print("(%s) end" % os.getpid())

outputs

macname@MacdeMacBook-Pro py %python3 cccccc.py

(54303) start

write启动(54305),父进程为(54303)

read启动(54306),父进程为(54303)

read从Queue获取到消息:p

read从Queue获取到消息:y

read从Queue获取到消息:t

read从Queue获取到消息:h

read从Queue获取到消息:o

read从Queue获取到消息:n

(54303) end

macname@MacdeMacBook-Pro py %

python 进程池_python进程池相关推荐

  1. python进程池_python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

  2. python 线程池_Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  3. python运行原理_Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  4. python 线程池_python线程池

    线程池概念 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务. 构建服务器应用程序的一个过于简单的模型是:每当一个请求到 ...

  5. python内存持续增长_Python 进程内存增长解决方案

    一.表现 运行环境: # uname –a Linux ** 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_ ...

  6. 永恒python怎么强化_python 进程

    关于进程和子进程,操作系统收到创建进程的命令后,会把当前运行的进程A copy一份成B当做A进程的子进程,A进程是B进程的副进程,但是A和B进程其实是完全一样的. 子进程返回的值是0, 父进程返回的值 ...

  7. python进程池一个进程卡住_python进程池,每个进程都有超时

    您可以使f(n)协同工作,以便它总是在超时内完成(如在GUI/网络事件处理程序中).在 如果不能使其协同工作,则唯一可靠的选择是终止运行函数的进程:import multiprocessing as ...

  8. python守护进程进程池_Python进程池非守护进程?

    在multiprocessing.pool.Pool类创建在其工作进程__init__的方法,使他们邪,开始他们,这是不可能自己重新设置daemon属性False在开始之前(事后这是不允许的了).但是 ...

  9. python数据库管理实例_Python数据库连接池实例——PooledDB

    不用连接池的MySQL连接方法 import MySQLdb conn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='m ...

最新文章

  1. python 入门笔记
  2. 德尔塔克戎,新冠“双毒合一”变体首次证实
  3. python适合零基础学习吗-零基础,经济学专业,适合自学Python吗?
  4. Spring IOC和MVC基础知识
  5. 一键部署VS插件:让.NET开发者更幸福
  6. 入门干货之Grpc的.Net 封装-MagicOnion
  7. python数据包分析_python | 数据分析(一)- Numpy数据包
  8. 青海师大c语言研究生专业课_【考研资讯】多所高校更改专业课科目!考研人还能再怎么惨?...
  9. 容易被忽略的label标签
  10. php 两个单词 正则表达式字符前_【阅读整理】正则表达式 - 基础篇
  11. 2021年NLP重要国际会议时间
  12. [交叉验证]机器学习中分类器的选择
  13. 后现代婚礼机器人显神通_机器人+无人机 江西新余智能消防显“神通”
  14. 小米路由mpk插件二维码_小米WiFi6路由器新品:修改密码自动同步已连接设备,这功能不错...
  15. 查看python源码位置方法以及潜在误区
  16. Ubuntu 安装微信网页版客户端
  17. 【matlab】把大写字母转换成小写,小写转大写,否则不变
  18. 计算机网络中的猫,宽带猫的作用和分类【图解】
  19. scrapy mysql 豆瓣_Python爬虫之Scrapy+Mysql+Mongodb爬豆瓣top250电影
  20. python系列tkinter之pack布局、place布局和grid布局

热门文章

  1. ubuntu16.4下用jexus部署asp.net core rtm
  2. c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查
  3. pdf.js 利用HTML5技术显示pdf内容
  4. 【ArcGIS Pro微课1000例】0003:ArcGIS pro 2.5加载OSGB点云模型案例教程
  5. python之解析最简单的xml
  6. Android之context相关类图
  7. 反序列化层遍历二叉树
  8. linux重新做yum,Linux 系统 Centos 7.7 下重装yum
  9. java trim()函数_Java - split()函数和trim()函数的使用方法
  10. ajax速度axio速度,[转]Ajax Fetch Axios之间的详细区别以及优缺点