进程池Pool的imap方法解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程池Pool的imap方法解析相关的知识,希望对你有一定的参考价值。
参考技术A Python中,multiprocessing库中Pool类代表进程池,其对象有imap()和imap_unordered()方法。
两者都用于对大量数据遍历多进程计算,返回一个迭代器(multiprocessing.pool.IMapIterator)。
imap返回结果顺序和输入相同,imap_unordered则为不保证顺序。
经过测试,发现Python多进程和imap()的一些特性:
1、 iter = pool.imap(fn, data) 一旦生成,无论使不使用iter,多进程计算都会开始。
计算结果会缓存在内存中,所以要注意内存用尽的问题。
2、fn,即执行函数,不可以是局部对象(不能嵌套在其他函数里),否则会报错:
AttributeError: Can\'t pickle local object \'fn_outer.<locals>.fn\'
3、使用进程池map数据时,如果每次的运算量很小,最后的效率还不如单进程。这时多进程切换造成的开销已大于多进程计算提升的效率。
这时,可以将输入数据集分段,每次map,计算一段。具体分段多大时获得最佳效率,需要实际测试。
4、注意,Pool使用完毕后必须关闭,否则进程不会退出。
有两种写法,推荐第2种:
注意 ,第二种中,必须在with的块内使用iter。
05 进程池map方法
import time from multiprocessing import Process,Pool # def f1(n): # time.sleep(1) # print(n) #对比多进程和进程池的效率 def f1(n): for i in range(5): n = n + i if __name__ == ‘__main__‘: #统计进程池执行100个任务的时间 s_time = time.time() pool = Pool(4) #里面这个参数是指定进程池中有多少个进程用的,4表示4个进程,如果不传参数,默认开启的进程数一般是cpu的个数 # pool.map(f1,[1,2]) #参数数据必须是可迭代的 pool.map(f1,range(100)) #参数数据必须是可迭代的,异步提交任务,自带join功能 e_time = time.time() dif_time = e_time - s_time #统计100个进程,来执行100个任务的执行时间 p_s_t = time.time() #多进程起始时间 p_list = [] for i in range(100): p = Process(target=f1,args=(i,)) p.start() p_list.append(p) # p.join() [pp.join() for pp in p_list] p_e_t = time.time() p_dif_t = p_e_t - p_s_t print(‘进程池的时间:‘,dif_time) print(‘多进程的执行时间:‘,p_dif_t) # 结果: # 进程池的时间: 0.40102291107177734 # 多进程的执行时间: 9.247529029846191
以上是关于进程池Pool的imap方法解析的主要内容,如果未能解决你的问题,请参考以下文章
第35篇 进程之间的通信 Queue Pipe 进程池Pool,p.apply()方法,p.apply_async()方法