首頁  >  文章  >  後端開發  >  如何在 Python 的多處理模組中的工作進程之間安全地共享佇列?

如何在 Python 的多處理模組中的工作進程之間安全地共享佇列?

DDD
DDD原創
2024-10-19 18:47:02785瀏覽

How to Share a Queue Safely Between Worker Processes in Python's Multiprocessing Module?

在多個工作進程之間共享佇列

多處理模組提供了創建和管理多個進程以同時執行任務的機制。一個常見的用例是讓工作進程將其結果報告回中央進程。這就是隊列發揮作用的地方。然而,當使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn