进程池
产生原因
如果有大量任务需要多进程完成,则可能需要频繁的创建删除进程,给进算计带来较多的资源消耗。
进程池的原理
创建适当的进程放入进程池,用来处理待处理事件,处理完毕后进程不销毁,仍然在进程池中等待处理其他事件,直到事件全部处理完毕,进程退出。 进程的复用降低了资源的消耗。
进程池的创建
- 创建进程池,在池内放入合适数量的进程
- 将事件加入进程池的等待队列
- 使用进程池内的进程不断的执行等待事件,直到所有事件执行完毕
- 所有事件处理完毕后,关闭进程池,回收进程池
进程池的具体操作
-
Pool(processes)
- 功能:创建进程池对象
- 参数:进程池中进程的数量
-
apply_async()
- 功能:以异步的方式将要执行的事件放入进程池
- 参数:
-
func
要执行的函数 -
args
给函数按位置传参 -
kwds
给函数按照键值传参
-
- 返回值:
返回一个代表进程池事件的对象,可以通过调用get()
函数获取事件函数return
的内容
-
apply()
按照顺序添加要执行的事件,执行一个再添加一个 -
close()
关闭进程池,使其不能再加入新的事件 -
join()
阻塞等待进程池将事件都执行结束后回收进程池 -
map()
类似于内建函数map
,将第二个参数的迭代对象中的数据逐个带入第一个函数作为参数。只不过兼顾了apply_async
功能,将函数放入进程池
# pool.py
from multiprocessing import Pool
import time
def worker(msg):
time.sleep(1)
print(msg)
return time.ctime()
pool = Pool(processes = 4)
result = []
for i in range(10):
msg = 'Hello %d world' % i
r = pool.apply_async(func = worker,args = (msg,))
result.append(r)
pool.close()
pool.join()
for i in result:
print(i.get())
# pool_map.py
from multiprocessing import Pool
import time
def fun(n):
time.sleep(1)
print('pool map')
return n * n
pool = Pool(4)
r = pool.map(fun,range(10))
pool.close()
pool.join()
print(r)