亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

隊列空方法壞了嗎?

隊列空方法壞了嗎?

動漫人物 2023-05-23 16:53:35
如何檢查隊列是否為空?運行以下代碼:from multiprocessing import Queueq = Queue()print(q.empty())q.put("a")print(q.empty())呈現:TrueTrue添加元素后不應該q.empty()返回嗎?False
查看完整描述

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。


查看完整回答
反對 回復 2023-05-23
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

官方推薦的解決方案是使用Manager.Queue.

引用自Python 文檔:

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


查看完整回答
反對 回復 2023-05-23
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

put方法是異步的,因此在檢查元素時隊列可能仍然是空的。添加time.sleep(1)putempty()返回False。



查看完整回答
反對 回復 2023-05-23
  • 3 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號