网络编程:进程创建--标准库multiprocessing模块(二--Pool)
进程池--multiprocessing模块的Pool方法
1、进程池技术
产生原因 : 如果有大量的任务需要多进程完成,而任务周期又比较短且需要频繁创建。
此时可能产生大量进程频繁创建销毁的情况,消耗计算机资源较大。
2、使用方法
【1】创建进程池,在池内放入适当数量的进程
【2】将事件封装函数,放入到进程池
【3】事件不断运行,知道所有放入进程池事件运行完成
【4】关闭进程池,回收进程
from multiprocessing import Pool
3、创建进程池对象
pool=Pool(processes)
功能:创建进程池对象
参数:想要存放的进程数量
返回 : 进程池对象
4、将事件放入进程池中等待执行
pool.apply_async(fun,args,kwargs)
功能 : 将事件放入进程池等待执行
参数: fun, 要执行的事件函数
args, 以元组为fun传参
kwargs, 以字典为fun传参
返回值 : 返回一个事件对象, 通过get()属性函数可以获取 fun的返回值
5、将事件放入进程池中等待执行
pool.apply(fun,args,kwargs)
功能 : 将事件放入进程等待池执行
参数: fun, 要执行的事件函数
args, 以元组为fun传参
kwargds, 以字典为fun传参
6、将要执行的事件放入到进程池中等待执行
pool.map(func,iter)
功能 : 将要执行的事件放入到进程池
参数 : func ,要执行的函数
iter, 迭代对象,给func传参
返回值 : 返回 func的返回值列表
7、关闭进程池
pool.close()
功能: 关闭进程池,无法再加入事件
8、回收进程池
pool.join()
功能 : 回收进程池
from multiprocessing import Pool
from time import sleep,ctime
def worker(msg):
sleep(2)
print(msg)
return ctime()
#创建进程池对象
pool = Pool(processes = 4)
result = []
for i in range(10):
msg = "hello %d"%i
#将事件放入进程池
r = pool.apply_async(func = worker,args = (msg,))
result.append(r)
#同步执行
# pool.apply(func = worker,args = (msg,))
#关闭进程池
pool.close()
#回收
pool.join()
#获取事件函数返回值
for i in result:
print(i.get())
from multiprocessing import Pool
import time
def fun(n):
time.sleep(1)
print("执行 pool map事件",n)
return n ** 2
pool = Pool(4)
#在进程池放入6个事件
r = pool.map(fun,range(6))
print("返回值列表:",r)
pool.close()
pool.join()