【Python教學】淺談 Multi-processing pool 使用方法

Multi processing pool

一. 簡單的 Multi-processing pool 範例

使用 Python 標準庫內 multiprocessing 寫一個 multi-processing pool (多處理程序池 / 多進程池),簡單的範例如下:

二. 建議使用處理程序 (process) 數量

可使用 multiprocessing.cpu_count() 或 os.cpu_count() 來獲取當前機器的 CPU 核心數量。
假設目前 CPU 是四核,那麼 process 設定如果超過 4 的話,代表有個核會同時運行 2 個以上的任務,而 CPU 之間程序處理會切換造成本進而降低處理效率,所以建議設置 process 時,最好等於當前機器的 CPU 核心數量。

三. 了解 pool 能調用的方法(method)

剛剛使用了 pool.map(main_map, inputs) 的 pool.map 方法來啟動 multi-processing pool,接下來我們探討一下還有什麼方法啟動多處理程序池,以及不同方法之間他們有差異呢?

而我們這次主要介紹的將會有:

  • map
  • map_async
  • starmap:New in version Python 3.3.
  • starmap_async:New in version Python 3.3.
  • close
  • join

參考文章:python – multiprocessing.Pool: When to use apply, apply_async or map? – Stack Overflow

▍到底有用 _async 是差在哪裡?

首先我們使用 pool.map 來看一下輸出結果:

接下來我們使用 pool.map_async 來看看輸出結果:

pool.map_async 和 pool.map 的差異在於,主處理程序是否同步並行,而 pool.map 會阻塞主程序,待所有子程序結束後,才會繼續運行主程序。而 pool.map_async 反之,所以最後要寫 close 和 join 來避免主程序結束後,子程序被迫關閉。

關於更多 close() 和 join() 的敘述可以看官方文件的說明如下:

close():

Prevents any more tasks from being submitted to the pool. Once all the tasks have been completed the worker processes will exit.

join():

Wait for the worker processes to exit. One must call close() or terminate() before using join() .

▍map 和 starmap 到底差在哪裡?

首先我們來看看官方文件對 starmap 的敘述

Like map() except that the elements of the iterable are expected to be iterables that are unpacked as arguments. Hence an iterable of [(1,2), (3, 4)] results in [func(1,2), func(3,4)].

同官方文件所述 map 和 starmap 差別僅在於能否傳入 Multi-args 多參數到同一個 function 內

pool.map 使用方法:

pool.starmap 使用方法:

▍Callback?

可以使用 callback 的有:

  • map_async
  • starmap_async

使用 map_async 寫 callback 範例:

輸出結果:

從 print 結果可以看到此次啟動了 4 個子處理程序,最後子處理程序都運送完後,由主程序處理啟動 callback 的函式 show,最後結束主處理程序。

▍取得回傳資料

pool.map_async 和 pool.starmap_async 要取的回傳資料需要使用 .get() 方法

pool.map 和 pool.starmap 可直接調用即可

▍補充 chunksize & maxtasksperchild 是什麼?

1. maxtaslsperchild:

當完成多少任務時,須重啟子處理程序
使用方法:

官方文件說明:maxtasksperchild

maxtasksperchild is the number of tasks a worker process can complete before it will exit and be replaced with a fresh worker process, to enable unused resources to be freed. The default maxtasksperchild is None, which means worker processes will live as long as the pool.
New in version 3.2: maxtasksperchild

2. chunksize:

每次子處理程序可以接收到的任務數量
使用方法:

官方文件說明:chunksize

the iterable into a number of chunks which it submits to the process pool as separate tasks. The (approximate) size of these chunks can be specified by setting chunksize to a positive integer.

最後~

▍回顧本篇我們介紹了的內容:

  • 簡單的 multi-processing pool 範例
  • 建議使用處理程序 (process) 數量
  • 了解 pool 能調用的方法(method)
    • 到底有用 _async 是差在哪裡?
    • map 和 starmap 到底差在哪裡?
    • Callback?
    • 取得回傳資料
    • 補充 chunksize & maxtasksperchild 是什麼?

▍關於與 Concurrency Programming 相關其他文章,可以參考:

▍關於 Async IO 相關其他文章,可以參考:

那麼有關於【Python教學】淺談 Multi-processing pool 使用方法 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~

有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *