Python 中的執行緒池:多處理池的替代方案
多處理模組的Pool 類別提供了一種使用工作進程並行化程式碼的便捷方法。然而,對於某些用例,可能需要利用執行緒而不是進程。本文探討了多處理模組中可用的另一種基於執行緒的 Pool 介面。
問題陳述:
使用者尋求提供「Pool」類別的 Python 函式庫用於執行緒工作進程,類似於多處理模組的 Pool 類別。這將允許使用多處理池輕鬆並行化類似於以下範例的任務:
def long_running_func(p): c_func_no_gil(p) p = multiprocessing.Pool(4) xs = p.map(long_running_func, range(100))
但是,使用者希望避免與建立新進程相關的開銷。
解決方案:
多處理模組包含一個基於線程的 Pool 接口,值得探索。這個鮮為人知的介面可以使用 multiprocessing.pool 模組中的 ThreadPool 類別來導入:
from multiprocessing.pool import ThreadPool
在幕後,這個 ThreadPool 類別利用了一個包裝 Python 執行緒的虛擬 Process 類別。這個虛擬 Process 類別在 multiprocessing.dummy 模組中實現,該模組提供了基於線程的完整多處理介面。
用法範例:
要使用 ThreadPool,請實例化具有所需數量的工作執行緒的 ThreadPool 物件。然後,呼叫 map 方法在工作執行緒之間並行化函數。
# Create a ThreadPool with 4 worker threads pool = ThreadPool(4) # Parallelize the `long_running_func` on 100 inputs results = pool.map(long_running_func, range(100))
以上是我什麼時候應該使用Python的ThreadPool而不是multiprocessing.Pool?的詳細內容。更多資訊請關注PHP中文網其他相關文章!