簡體   English   中英

multiprocessing.Queue - 如果在 `queue.get()` 之前沒有調用`queue.empty()`,單個線程會掛在`queue.get()` 上嗎?

[英]multiprocessing.Queue - Will a single thread hang on `queue.get()` if not `queue.empty()` is called before `queue.get()`?

文檔multiprocessing.Queue().empty()有這樣的說法:

如果隊列為空,則返回 True,否則返回 False。 由於多線程/多處理語義,這是不可靠的。

假設我有一個調用 queue.get() 的線程/進程,而不是多個消費者。

以下代碼是否可以掛在queue.get()

def process_queue(queue):
    while not queue.empty():
        item = queue.get()
        print(f"The item is {item}")

我認為只要您有一個調用process_queue的線程/進程,代碼就永遠不會掛起。

當然,一旦多個線程/進程調用process_queue ,所有的賭注都被取消了。

如果只有一個消費者,你是對的,那段代碼永遠不會阻塞在queue.get()上。

請注意,如果上面的代碼塊碰巧在您的任何生產者能夠開始填充隊列之前開始運行,或者如果它碰巧耗盡隊列而生產者仍有更多項目要添加,則上述代碼塊將無法按預期工作. 這可能與您的用例無關,但如果是,您可能希望使用哨兵/毒丸來告訴您的消費者何時應該停止檢查新項目。 這樣,它只會在生產者沒有完成生產新項目的情況下阻塞get()

暫無
暫無

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

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