Python里multiprocessing 多進程編程multiprocessing的進程池

進程池是python中用于并行執(zhí)行任務的工具,核心是multiprocessing.pool類。它能自動管理進程數(shù)量、任務分配和結果回收,適合cpu密集型任務。使用流程:1.導入pool模塊;2.定義要執(zhí)行的函數(shù);3.創(chuàng)建進程池并用map或apply_async提交任務。注意事項包括:1.進程數(shù)建議設為cpu核心數(shù);2.map適用于統(tǒng)一任務,apply_async更靈活;3.map返回列表,apply_async需調用get()獲取結果;4可用value或Array共享狀態(tài),復雜需求用manager()。不適用場景包括:任務短小、依賴性強或內存占用高。合理使用可顯著提升性能,但需根據(jù)實際調整策略。

python 的多進程編程中,multiprocessing 模塊的進程池(Pool)是一個非常實用的工具,尤其適合處理需要并行執(zhí)行多個任務的場景。它能自動管理進程數(shù)量、任務分配和結果回收,非常適合 CPU 密集型任務。


什么是進程池?

進程池的核心是 multiprocessing.Pool 類。你可以把它理解成一個“工人小組”,你把任務交給這個小組,他們自動安排誰去做哪個任務,不需要你自己一個個創(chuàng)建和管理進程。

舉個簡單的例子:假設你要處理 100 個數(shù)據(jù)文件,每個文件處理耗時較長,這時候用進程池就能同時啟動多個進程來并行處理這些文件,而不是一個一個串行等下去。


怎么使用進程池?

基本使用流程如下:

立即學習Python免費學習筆記(深入)”;

  1. 導入模塊

    from multiprocessing import Pool
  2. 定義要并行執(zhí)行的函數(shù)

    def process_file(filename):     # 處理文件邏輯     return result
  3. 創(chuàng)建進程池,并使用 map 或 apply_async 提交任務

    if __name__ == '__main__':     files = ['file1.txt', 'file2.txt', ..., 'file100.txt']     with Pool(processes=4) as pool:  # 啟動4個進程         results = pool.map(process_file, files)

這樣就可以并發(fā)地處理所有文件了。

注意:windows 上運行一定要加上 if __name__ == ‘__main__’: 這個判斷,否則會報錯。


常見問題和注意事項

1. 進程數(shù)設置多少合適?

  • 一般建議設置為 CPU 核心數(shù),可以通過 os.cpu_count() 獲取。
  • 如果進程數(shù)太多,反而會因為頻繁切換上下文而降低效率。
  • 如果任務涉及 IO 等待(比如網(wǎng)絡請求),可以適當增加進程數(shù)。

2. 使用 map 和 apply_async 的區(qū)別

  • map(func, iterable) 更簡單,適用于所有任務都一樣、參數(shù)是單個值的情況。
  • apply_async(func, args=()) 更靈活,適合傳多個參數(shù)或異步回調。

示例:

def add(a, b):     return a + b  with Pool(4) as pool:     res = pool.apply_async(add, (2, 3))     print(res.get())  # 輸出 5

3. 返回結果的方式

  • map 會直接返回一個列表,順序和輸入一致。
  • apply_async 需要用 .get() 方法獲取結果,也可以加回調函數(shù) .apply_async(…, callback=handle_result)。

4. 共享狀態(tài)怎么辦?

如果你希望多個進程共享某些變量,需要注意:

  • 默認情況下,進程之間不共享內存。
  • 可以使用 multiprocessing.Value 或 multiprocessing.Array 來實現(xiàn)共享內存。
  • 更復雜的需求可以用 Manager() 創(chuàng)建一個服務器進程來管理共享對象

什么時候不該用進程池?

雖然進程池很好用,但也不是萬能的:

  • 如果任務本身很快完成(比如幾毫秒),使用進程池反而增加了進程創(chuàng)建銷毀的開銷。
  • 如果任務之間依賴性很強,或者需要頻繁通信,可能更適合用線程或其他方式。
  • 如果你的程序已經用了大量的內存,再開多個進程可能會導致內存不足。

基本上就這些。合理使用進程池能顯著提升性能,尤其是處理計算密集型任務的時候。不過要注意別一股腦全用上,還是要根據(jù)實際場景調整。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享