3 回答
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
兩種可能的解決方案:
使用queue.Queueinstead of multiprocessing.Queue:它們之間在文檔中的一些差異:
它們的區(qū)別在于 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 在評(píng)論中所說(shuō)的那樣。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
關(guān)于原因sleep(0),零值會(huì)導(dǎo)致線程將其剩余時(shí)間片放棄給任何其他準(zhǔn)備好運(yùn)行的線程。如果沒(méi)有其他線程準(zhǔn)備運(yùn)行,函數(shù)立即返回,線程繼續(xù)執(zhí)行 cpu讓出資源,去執(zhí)行q.emety()task。我是這么想的。
穩(wěn)定的方法是使用queue.Queueor queues.SimpleQueue。
TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
官方推薦的解決方案是使用Manager.Queue.
引用自Python 文檔:
注意:
當(dāng)一個(gè)對(duì)象被放入隊(duì)列時(shí),該對(duì)象被 pickle 并且后臺(tái)線程稍后將 pickle 數(shù)據(jù)刷新到底層管道。這會(huì)產(chǎn)生一些令人驚訝的后果,但不會(huì)造成任何實(shí)際困難——如果它們真的讓您感到困擾,那么您可以改用由管理器創(chuàng)建的隊(duì)列。
1. 將對(duì)象放入空隊(duì)列后,在隊(duì)列的 empty() 方法返回 False 和 get_nowait() 可以返回而不引發(fā) Queue.Empty 之前,可能會(huì)有無(wú)限小的延遲。
2. 如果多個(gè)進(jìn)程都在排隊(duì)對(duì)象,則有可能在另一端亂序接收對(duì)象。但是,由同一進(jìn)程排隊(duì)的對(duì)象將始終按照彼此的預(yù)期順序排列。
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
該put方法是異步的,因此在檢查元素時(shí)隊(duì)列可能仍然是空的。添加time.sleep(1)后put并empty()返回False。
添加回答
舉報(bào)
