在多個工作進程之間共享佇列
多處理模組提供了創建和管理多個進程以同時執行任務的機制。一個常見的用例是讓工作進程將其結果報告回中央進程。這就是隊列發揮作用的地方。然而,當使用 apply_async 產生工作進程時,在它們之間共享佇列可能具有挑戰性。
錯誤:僅用於繼承的佇列物件
當嘗試傳遞如果直接將佇列套用到apply_async,則可能會遇到RuntimeError:「佇列物件只能透過繼承在進程之間共用。在提供的程式碼中,工作進程不是從主進程繼承的,因此出現錯誤。
解決方案:使用 multiprocessing.Manager
要克服此繼承限制,多處理提供了 Manager 類別。 Manager 提供了一種建立可在多個進程(包括佇列)之間共用的物件的方法。透過利用 Manager,我們可以建立一個可供所有工作進程存取的佇列,而無需繼承。
重構程式碼:
以下程式碼示範如何共用使用multiprocessing.Manager 的工作進程之間的佇列:
import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) m = multiprocessing.Manager() q = m.Queue() workers = pool.apply_async(worker, (33, q))
在在此程式碼中,Manager() 建立一個管理器實例m,然後用於實例化共用佇列q。此佇列作為參數傳遞給 apply_async 方法,允許工作進程存取並向其寫入結果。這種方法可以透過共享佇列在工作進程和主進程之間進行通信,從而消除了繼承錯誤的可能性。
以上是如何在 Python 的多處理模組中的工作進程之間安全地共享佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!