2014-10-03 57 views
0

在我將一些dict存儲在Queue.Queue中的程序中,我必須列出每個條目而不從隊列中刪除它們。現在我用這個代碼片段遍歷條目:爲什麼使用Queue.Queue的雙端隊列被認爲是危險的?

elements = Queue.Queue() 
# populate the queue 

for elem in list(elements.queue): 
    # print elem 

Lib/Queue.pyLib/collections.py的代碼,我發現queue是代理deque,並在此answer「的Python:Queue.Queue與收藏。提到不直接使用deque

有什麼特別的理由不使用deque?希望有人能詳細闡述一下。

+3

我認爲你誤解了答案。使用'collections.deque'沒有什麼錯,你只是在使用'Queue'對象時不想使用'Queue.deque'。這是Queue對象的內部雙端隊列,你不應該直接操縱它。 – 2014-10-03 22:43:12

+0

這個解釋在你鏈接到的問題中是相當清楚的......如果你只需要一個數據結構,那麼一個雙向轉換就可以了。 – beoliver 2014-10-03 22:43:49

+0

https://docs.python.org/2/library/collections.html#collections.deque – beoliver 2014-10-03 22:46:00

回答

1

的原因及其危害遍歷一個Queue.Queue的內部deque是另一個線程可以一起去,並添加或當你遍歷(通過使用queue.put/queue.get)從deque刪除項目。這意味着迭代過程中你的迭代可能會改變大小,這會導致Python中未定義的行爲,而不是你想要發生的事情。您可以遍歷deque安全,不過,通過收購Queue第一的內部mutex

elements = Queue.Queue() 
# populate the queue 

with elements.mutex: 
    for elem in list(elements.queue): 
     # print elem 

這樣,所有其它線程將被添加或當你重複刪除從Queue元素阻止。

現在,這與使用deque一般無關 - 這是一個非常有效的事情。這只是在使用Queue.Queue內部的deque的情況下,您需要小心。

相關問題