進程池Pool的imap方法解析

Python中,multiprocessing庫中Pool類代表進程池,其對象有imap()和imap_unordered()方法。
兩者都用于對大量數(shù)據(jù)遍歷多進程計算,返回一個迭代器(multiprocessing.pool.IMapIterator)。

imap返回結果順序和輸入相同,imap_unordered則為不保證順序。

經過測試,發(fā)現(xiàn)Python多進程和imap()的一些特性:

1、iter = pool.imap(fn, data) 一旦生成,無論使不使用iter,多進程計算都會開始。
計算結果會緩存在內存中,所以要注意內存用盡的問題。

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使用完畢后必須關閉,否則進程不會退出。
有兩種寫法,推薦第2種:
注意,第二種中,必須在with的塊內使用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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • python之進程、線程與協(xié)程 有這么個例子說他們的區(qū)別,幫助理解很有用。 有一個老板想開一個工廠生產手機。 他需...
    道無虛閱讀 3,214評論 0 3
  • 必備的理論基礎 1.操作系統(tǒng)作用: 隱藏丑陋復雜的硬件接口,提供良好的抽象接口。 管理調度進程,并將多個進程對硬件...
    drfung閱讀 3,588評論 0 5
  • PYTHON-進階-ITERTOOLS模塊小結轉自wklken:http://wklken.me/posts/20...
    C_Y_閱讀 1,047評論 0 2
  • 引言 講到進程,不得不先說下linux的fork()函數(shù),一個進程調用fork()函數(shù)后,系統(tǒng)先給新的進程分配資源...
    StormZhu閱讀 1,579評論 0 1
  • 《慢下來,去生活》 快,是一種生活方式。 慢,則是一種生活態(tài)度。 隨著科技的進步,社會的發(fā)展,現(xiàn)代人的視覺和聽覺周...
    淡紫色的年華19閱讀 383評論 0 0