-
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,主進程都會等待,直到進程池中所有進程執行完畢,纔會繼續往下執行。