44.Python 进程池multiprocessing.Pool

最后更新于:2020-03-21 11:53:37

python进程池Pool 和前面讲解的python线程池 类似,虽然使用多进程能提高效率,但是进程的创建会消耗大量的计算机资源(进程Process的创建远远大于线程Thread创建占用的资源),线程是计算机最小的运行单位,连线程都需要使用线程池,进程有什么理由不使用进程池?

需要注意的是,在Windows上要想使用进程模块,就必须把有关进程的代码写在if __name__ == ‘__main__’ 内,否则在Windows下使用进程模块会产生异常。Unix/Linux下则不需要。

一.进程池Pool介绍

Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。

# 导入进程模块

import multiprocessing

# 最多允许3个进程同时运行

pool = multiprocessing.Pool(processes = 3)

1、apply() — 该函数用于传递不定参数,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不在出现),函数原型如下:

apply(func, args=(), kwds={})

2、apply_async— 与apply用法一致,但它是非阻塞的且支持结果返回后进行回调,函数原型如下:

apply_async(func[, args=()[, kwds={}[, callback=None]]])

3、map() — Pool类中的map方法,与内置的map函数用法基本一致,它会使进程阻塞直到结果返回,函数原型如下:

map(func, iterable, chunksize=None)

注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

4、map_async()— 与map用法一致,但是它是非阻塞的。其有关事项见apply_async,函数原型如下:

map_async(func, iterable, chunksize, callback)

5、close()— 关闭进程池(pool),使其不在接受新的任务。

6、terminal() — 结束工作进程,不在处理未处理的任务。

7、join() — 主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。

二.进程池Pool使用

# !usr/bin/env python

# -*- coding:utf-8 _*-

"""

@Author:何以解忧

@Blog(个人博客地址): shuopython.com

@WeChat Official Account(微信公众号):猿说python

@Github:www.github.com

@File:python_process_Pool.py

@Time:2020/1/1 21:25

@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

"""

import multiprocessing

import time

def func(msg):

print("in:", msg)

time.sleep(3)

print("out,", msg)

if __name__ == "__main__":

# 这里设置允许同时运行的的进程数量要考虑机器cpu的数量,进程的数量最好别小于cpu的数量,

# 因为即使大于cpu的数量,增加了任务调度的时间,效率反而不能有效提高

pool = multiprocessing.Pool(processes = 3)

item_list = ['processes1' ,'processes2' ,'processes3' ,'processes4' ,'processes5' ,]

count = len(item_list)

for item in item_list:

msg = "python教程 %s" %item

# 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

pool.apply_async(func, (msg,))

pool.close()

pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

输出结果:

in: python教程 processes1

in: python教程 processes2

in: python教程 processes3

out, python教程 processes1

in: python教程 processes4

out, python教程 processes2

in: python教程 processes5

out, python教程 processes3

out, python教程 processes4

out, python教程 processes5

代码分析:

5个任务,3个进程,由于在进程池构造的时候允许同时最多执行3个进程,所以同时执行任务1/任务2/任务3,重代码的输出结果来看,任务1/任务2/任务3执行后,for循环进入阻塞状态,直到任务1/任务2/任务3其中一个结束之后才会for才会继续执行任务4/任务5,并保证同时执行的最多只有3个任务( 进程池multiprocessing.Pool 和 线程池ThreadPoolExecutor 原理相同).

猜你喜欢:

技术交流、商务合作请直接联系博主

扫码或搜索:猿说python

猿说python

微信公众号 扫一扫关注

赞赏

微信赞赏支付宝赞赏

python 进程池 等待数量_python 进程池multiprocessing.Pool相关推荐

  1. python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...

    1. 2. 为啥要有 进程池和线程池 进程池来控制进程数目,比如httpd的进程模式,规定最小进程数和最大进程数 3.创建进程池的类pool 如果指定numprocess为3,则进程池会从无到有创建三 ...

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

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

  3. python 多进程 调用模块内函数_Python进程池multiprocessing.Pool的用法

    一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...

  4. python进程池调用实例方法_python 进程池的简单使用方法

    回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from ...

  5. python的进程池map函数_python进程池map

    python进程池怎么实现 当进程池中任务队列非空时,才会触发worker进程去工作,那么如何向进程池中的任务队列中添加任务呢,进程池类有两组关键方法来创建任务,分别是apply/apply_asyn ...

  6. python进程池的作用_python 进程池的简单使用方法

    回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from ...

  7. python进程池如何复用_python进程池剖析(一)

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

  8. python manager 共享数据访问_python 进程间数据共享multiProcess.Manger实现解析

    一.进程之间的数据共享 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁定和其他同步手段的需求, ...

  9. python数据库连接池工具类_Python数据库连接池DBUtils

    DBUtils简介 DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放 ...

最新文章

  1. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名...
  2. Win10环境下搭建virtualenvwrapper-win
  3. Android总结篇系列:Activity Intent Flags及Task相关属性
  4. 复制Oracle表的结构
  5. fan怎么写 jin_拼音为fan的字
  6. 语言在线组卷系统_如何使用在线考试系统创建题库?
  7. Linux常用解压文件
  8. 【肌电信号】基于matlab GUI MUAP波形【含Matlab源码 736期】
  9. 2019工程伦理(2019秋) 所有答案
  10. 计算机视觉三大国际会议ICCV、ECCV、CVPR
  11. meterpreter使用
  12. 终于找到使用Sql Server Management Studio导致蓝屏的罪魁祸首了
  13. 活体检测——Oulu-NPU数据集
  14. hdf heg 批量拼接_python调用HEG工具批量处理MODIS数据
  15. 如何在Windows 10中打开设置?
  16. 声表面波传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. oracle 数据库如何获取一条sql语句执行所消耗耗费的时间?
  18. u盘Linux、window双系统文件格式安装
  19. 【小程序】滚动的公告栏
  20. 软件设计---过程设计

热门文章

  1. JavaScript每日一练经典小案例(一)
  2. 44.讲最短路径:地图软件是如何计算出最优出行路径的
  3. 合理设置包裹图片的标签的宽度与overflow:hidden
  4. gz文件解压 linux,linux下.tar.gz和.gz文件解压详解
  5. Linux tmux命令
  6. information
  7. 中国自身免疫药市场趋势报告、技术动态创新及市场预测
  8. 关于Django+Framework的最完整面试题(2)
  9. U盘和移动硬盘用什么文件系统?
  10. Hi3559 mtcnn 例程分析