簡體   English   中英

使用隊列在進程之間進行通信

[英]Using queue to communicate between processes

我在第一個池中有一個進程A,在第二個池中有多個進程B1..Bk,我想將項目放入A的隊列中並使用B1..Bk中的項目。

我的第一次嘗試是只創建multiprocessing.Queue並將其傳遞給所有這些進程。 但這給了我錯誤

RuntimeError: Queue objects should only be shared between processes through inheritance

我發現建議改用multiprocessing.Manager()。Queue()。 但是當我這樣做並嘗試從Bi中的隊列中讀取時,我得到了錯誤

TypeError: 'AutoProxy[Queue]' object is not iterable

那么正確的方法是什么呢?

OK,這只是我的愚蠢,我誤解了隊列是什么! 最重要的是,隊列是不可迭代的,因此不能“為某些情況而行”。 (我的錯誤是認為隊列代理是不可迭代的,因為它是代理。但是,如果使用put / get,則該代理可以代替實際隊列正常工作)而且,(FIFO)隊列無法關閉並且不能有一個自然的“結束”,我發現這很煩人,因為這意味着必須發送特殊的“隊列結束”條目,但不要過多地發送它們以防止無意間阻塞隊列。

因此,最重要的是:要共享隊列,我創建了一個multiprocessing.Manager()。Queue()並將其傳遞,然后在不同的進程中使用put / get寫入/讀取隊列,並將一些特殊條目發送給讀者指出工作即將結束。

但是,無法關閉隊列而使使用者獲得“隊列結束”條件確實很煩人,尤其是在出現錯誤情況時:如果k個使用者使用了隊列,那么編寫者必須知道k並發送k結束工作指標和k個消費者都必須表現良好,以取回這些指標並關閉。 如果存在任何錯誤,將無法再保證所有這些錯誤,例如,消費者可能會鎖定或超時,以等待永遠不會到達的作業結束指示符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM