04_进程池[Python常见问题]

1.为什么用进程池

    1.在需要频繁的创建删除较多进程的情况下,导致计算机资源消耗过多
    2.进程池则是创建指定进程数量等待执行事件,避免了不必要的创建和销毁过程

2.进程池的使用步骤

    1.创建进程池,在池内放入适量的进程,将事件加入进程池的等待队列

    2.使用进程池中的进程不断处理事件,所有事件处理后回收关闭进程池

3.语法概述

from multiprocessing import Pool

pool = Pool(processes=4)  # 创建指定进程数量进程池并返回进程池对象

# 异步方式将事件放入进程池执行,返回一个对象该对象
# callback: 回调函数,每当进程池中的进程处理完任务了,返回的结果交给回调函数,由回调函数进一步处理,回调函数只有异步时才有
ret = pool.apply_async(func, args=(), kwds={}, callback=None, error_callback=None)
    参数:
        func要执行的事件函数,可以通过返回值对象的 ret.get() 方法得到func函数的返回值
        args: 位置参数元组,要给函数传递的参数
        kwargs: 键值对参数字典,要给函数传递的参数
        callback: 进程的任务函数返回值被当做回调函数的形参接收到,以此进行进一步的处理操作,回调函数是主进程调用的
        error_callback: 错误时主进程执行的回调函数
pool.close()  # 关闭进程池,使其无法加入新的事件
pool.join()  # 阻塞等待进程池退出(当所有事情处理完毕后)
pool.apply()  # 用法和 pool.apply_async() 一样,但是没有返回值,异步方式将事件放入进程池顺序执行,一个事件结束再执行另一个事件
func_list = pool.map(func, iter)  # 类似于内建函数map,将第二个参数的迭代数传递给第一个参数的函数执行,同时兼容了使用进程池执行
# 示例:
from multiprocessing import Pool
import time


def fun(num):
    time.sleep(1)
    return num * num


test = [1, 2, 3, 4, 5, 6]
pool = Pool(3)

r = pool.map(fun, test)  # 返回fun函数的返回值列表
# 上面折行代码等同于以下注释部分的代码
# r = []
# for i in test:
#     res = pool.apply_async(fun, (i,))
#     r.append(res.get())
print(r)
pool.close()
pool.join()
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 04_进程池