3 回答

TA貢獻1998條經驗 獲得超6個贊
兩種可能的解決方案:
使用queue.Queueinstead of multiprocessing.Queue:它們之間在文檔中的一些差異:
它們的區別在于 Queue 缺少 Python 2.5 的 queue.Queue 類中引入的 task_done() 和 join() 方法。
from queue import Queue
q = Queue()
print(q.empty())
q.put("a")
print(q.empty())
或者就像@Hans Musgrave 在評論中所說的那樣。time.sleep(1)不能保證。您可以改用time.sleep(0):
from multiprocessing import Queue
import time
q = Queue()
print(q.empty())
time.sleep(0)
q.put("a")
print(q.empty())
他們都給我:
True
False
關于原因sleep(0),零值會導致線程將其剩余時間片放棄給任何其他準備好運行的線程。如果沒有其他線程準備運行,函數立即返回,線程繼續執行 cpu讓出資源,去執行q.emety()task。我是這么想的。
穩定的方法是使用queue.Queueor queues.SimpleQueue。

TA貢獻1951條經驗 獲得超3個贊
官方推薦的解決方案是使用Manager.Queue
.
引用自Python 文檔:
注意:
當一個對象被放入隊列時,該對象被 pickle 并且后臺線程稍后將 pickle 數據刷新到底層管道。這會產生一些令人驚訝的后果,但不會造成任何實際困難——如果它們真的讓您感到困擾,那么您可以改用由管理器創建的隊列。
1. 將對象放入空隊列后,在隊列的 empty() 方法返回 False 和 get_nowait() 可以返回而不引發 Queue.Empty 之前,可能會有無限小的延遲。
2. 如果多個進程都在排隊對象,則有可能在另一端亂序接收對象。但是,由同一進程排隊的對象將始終按照彼此的預期順序排列。
添加回答
舉報