前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >44.python 进程池multiprocessing.Pool

44.python 进程池multiprocessing.Pool

作者头像
猿说编程[Python和C]
修改2021-04-19 14:51:57
2.2K0
修改2021-04-19 14:51:57
举报
文章被收录于专栏:猿说编程猿说编程

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

不要问我为什么
不要问我为什么

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

心塞塞
心塞塞

一.进程池Pool介绍

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

代码语言:javascript
复制
# 导入进程模块
import multiprocessing
 
# 最多允许3个进程同时运行
pool = multiprocessing.Pool(processes = 3)

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

代码语言:javascript
复制
apply(func, args=(), kwds={})

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

代码语言:javascript
复制
apply_async(func[, args=()[, kwds={}[, callback=None]]])

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

代码语言:javascript
复制
map(func, iterable, chunksize=None)

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

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

代码语言:javascript
复制
map_async(func, iterable, chunksize, callback)

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

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

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

二.进程池Pool使用

代码语言:javascript
复制
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): https://www.codersrc.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函数等待所有子进程结束

输出结果:

代码语言:javascript
复制
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 原理相同).

猜你喜欢:

1.python 线程池ThreadPoolExecutor

2.python 进程Process

3.python 进程Process和线程threading区别

4.python 进程间通信Queue/Pipe

5.python 进程互斥锁Lock

转载请注明猿说Python » python 进程池multiprocessing.Pool

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.进程池Pool介绍
  • 二.进程池Pool使用
    • 猜你喜欢:
    相关产品与服务
    腾讯云代码分析
    腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档