Pool實現多進程並行

  • Pool 模塊來自於 multiprocessing 模塊。

multiprocessing 模塊是跨平臺版本的多進程模塊,像線程一樣管理進程,與 threading 很相似,對多核CPU的利用率會比 threading 好的多。Pool 類可以提供指定數量的進程供用戶調用,當有新的請求提交到Pool中時,如果池還沒有滿,就會創建一個新的進程來執行請求。如果池滿,請求就會告知先等待,直到池中有進程結束,纔會創建新的進程來執行這些請求。

  • 函數

1、apply()

函數原型:apply(func[, args=()[, kwds={}]]),      該函數用於傳遞不定參數,同python中的apply函數一致,主進程會被阻塞直到函數執行結束(不建議使用,並且3.x以後不在出現)。

2、apply_async()

函數原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])。  與apply用法一致,但它是非阻塞的且支持結果返回後進行回調。

3、map()

函數原型:map(func, iterable[, chunksize=None]), Pool類中的map方法,與內置的map函數用法行爲基本一致,它會使進程阻塞直到結果返回。

4、map_async()

函數原型:map_async(func, iterable[, chunksize[, callback]])。 與map用法一致,但是它是非阻塞的。其有關事項見apply_async。

5、close()關閉進程池(pool),使其不在接受新的任務。

6、terminal()結束工作進程,不在處理未處理的任務。

7、join()主進程阻塞等待子進程的退出, join方法要在close或terminate之後使用。

  • code—view

import os
from multiprocessing import Pool

def process_multi(targetDir, resultDir):
    files = os.listdir(targetDir)
    pool = Pool(processes=10)
    for fileName in files:
        if not fileName.startswith('x'):
            continue
        targetFile = os.path.join(targetDir, fileName)
        resultFile = os.path.join(resultDir, fileName)
        pool.apply_async(process, (targetFile, resultFile))
    pool.close()
    pool.join()

備註

1、阻塞與非阻塞的區別:

  • map() 會使進程阻塞,即通過 map() 開啓的多進程都結束之後,這個函數纔會有返回結果,否則主進程會一直等待,不會往下進行。
  • map_async() 爲非阻塞,即通過 map_async() 開啓多進程之後,立刻會返回結果,主進程會繼續往下執行。

注意:如果後面調用了 join() 函數,則不管之前用的是 map 還是 map_async,主進程都會等待,直到進程池中所有進程執行完畢,纔會繼續往下執行。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章