当程序中需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。
一.进程池
引入进程池:from multiprocessing import Pool
创建进程池 : pool=Pool( numprocess , initializer , initargs )
pool类包含的实例化方法:
实例化一个进程池:pool=Pool(10)
当使用此种同步出来方法时,进程池不需要close和join,并且进程池中的所有进程都是普通进程(主进程等待其执行完毕后才会结束)
import multiprocessing
import time
def func(num):
num+=1
time.sleep(0.2)
return num
def main():
start_time=time.time()
pool=multiprocessing.Pool(5)
start=time.time()
for i in range(20):
res=pool.apply(func,args=(i)) #调用同步方法 会直接返回目标函数的返回值
print(res,end=' ')
end_time=time.time()
total_time=end_time-start_time
print('\n',total_time)
output:
1 2 3 4 5 6 7 8 9 10
2.535144805908203
2.pool.apply_async(func,args=(),callback=None)
func:目标函数
args:传递给目标函数的参数
callback:回调函数。每当进程池中有进程处理完任务,返回了函数的返回值可以交给回调函数处理。回调函数只有异步才有,同步没有。(此处该方法会返回一个进程函数对象,该对象调用get方法可以得到回调函数处理的结果) (暂时还没找到对于这个回调函数更好的解释,以后看官方文档再来补齐)
case:
import multiprocessing
import time
def func(num):
num+=1
time.sleep(0.2)
return num
def main():
l=[]
start_time=time.time()
pool=multiprocessing.Pool(5)
start=time.time()
for i in range(20):
res=pool.apply_async(func,args=(i,))
l.append(res)
p.close()
p.join() #此处必须设置.join() 否则进程池中进程全部为守护进程
for i in l:
print(i.get(),end=' ')
end_time=time.time()
total_time=end_time-start_time
print('\n',total_time)
output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1.423081398010254
可以很明显看出,异步的进程池效率比同步的要高。
对于进程池中的消息队列,其创建方式也有一点变化:
import multiprocessing #导入模块
pool=multiprocessing.Pool() #创建进程池
queue=multiprocessing.Manager().Queue() #创建进程中的消息队列
暂时对于python中进程池的笔记到这里,以后的生产生活中我会继续学习。
原文:https://www.cnblogs.com/magicdata/p/12323657.html