簡體   English   中英

在python中清空multiprocessing.queue(-1)的首選方法

[英]Preferred way to empty multiprocessing.queue(-1) in python

我想拉出當前隊列中的所有項目。 還有另一個線程不斷地將項目放在另一端,每個時期我想要獲取當前隊列中的所有項目。

有什么理由可以選擇:

res = []
while q.qsize > 0 :
    res.append(q.get())

要么

res = []
while True :
    try :
         res.append(q.get(block=False)) 
    except Queue.Empty :
         break

現在文檔明確指出qsize()> 0不會阻止隊列在get上阻塞,但只有在多個線程可以從輸出獲取的情況下才是這樣嗎?

隊列。 qsize()返回隊列的大致大小。 注意,qsize()> 0不保證后續的get()不會阻塞,qsize()<maxsize也不保證put()不會阻塞。

這是否意味着第二種形式應該始終是首選? EAFP和所有這些? 另外,調用q.qsize()有任何成本嗎? 是否會阻塞隊列的另一端以便計算?

我想我已經談過使用第二種形式,但對我來說似乎不那么干凈。

是的,您應該始終使用第二種變體:API的文檔(應該)通常比未實現的實現細節更可靠。 即使當前的multiprocessing實現工作如此,在你的特殊情況下,如果qsize() > 0get()也不會阻塞,不能保證它將在未來的Python版本中保持這種狀態,因為文檔已經清楚地說明了它不是。

話雖這么說,使用當前版本的Python,第一個版本應該可靠,只要你只有一個消費過程。 調用qsize intenally調用sem_getvalue Linux和WaitForSingleObjectEx在Windows上 ; 兩者都沒有鎖定任何東西。 (對於Linux調用,這在聯機幫助頁中有記錄,對於Windows調用,這是一個強有力的猜測。)

請注意,如果您有多個使用者並且想要確保其中一個使用者讀取整個隊列,則必須使用包含循環的附加鎖!

暫無
暫無

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

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