Python中,multiprocessing庫中Pool類代表進程池翔始,其對象有imap()和imap_unordered()方法罗心。
兩者都用于對大量數(shù)據(jù)遍歷多進程計算,返回一個迭代器(multiprocessing.pool.IMapIterator)城瞎。
imap返回結(jié)果順序和輸入相同渤闷,imap_unordered則為不保證順序。
經(jīng)過測試脖镀,發(fā)現(xiàn)Python多進程和imap()的一些特性:
1飒箭、iter = pool.imap(fn, data)
一旦生成,無論使不使用iter蜒灰,多進程計算都會開始弦蹂。
計算結(jié)果會緩存在內(nèi)存中,所以要注意內(nèi)存用盡的問題强窖。
2凸椿、fn,即執(zhí)行函數(shù)翅溺,不可以是局部對象(不能嵌套在其他函數(shù)里)脑漫,否則會報錯:
def fn_outer():
def fn(a,b):
return a+b
pool = Pool()
pool.imap(fn, [(1,2)])
pool.close()
AttributeError: Can't pickle local object 'fn_outer.<locals>.fn'
3髓抑、使用進程池map數(shù)據(jù)時,如果每次的運算量很小优幸,最后的效率還不如單進程启昧。這時多進程切換造成的開銷已大于多進程計算提升的效率。
這時劈伴,可以將輸入數(shù)據(jù)集分段密末,每次map,計算一段跛璧。具體分段多大時獲得最佳效率严里,需要實際測試。
4追城、注意刹碾,Pool使用完畢后必須關(guān)閉,否則進程不會退出座柱。
有兩種寫法迷帜,推薦第2種:
注意,第二種中色洞,必須在with的塊內(nèi)使用iter戏锹。
pool = Pool()
iter = pool.imap(func, iter)
for ret in iter:
# do something
pool.close()
with Pool() as pool:
iter = pool.imap(func, iter)
for ret in iter:
# do something