在我将一些dict
存储在Queue.Queue
的程序中,我必须列出每个条目而不将其从队列中删除。现在我使用此代码片段迭代条目:
elements = Queue.Queue()
# populate the queue
for elem in list(elements.queue):
# print elem
在Lib/Queue.py
和Lib/collections.py
的代码中,我发现queue
是deque
的代理,以及answer的“Python:Queue.Queue”提到vs. collections.deque“不直接使用deque
。
有没有特别的理由不使用deque
?希望有人可以详细说明一下。
答案 0 :(得分:1)
迭代deque
的内部Queue.Queue
是危险的原因是另一个线程可能会出现并在您迭代它时添加或删除deque
中的项目(使用queue.put
/ queue.get
)。这意味着你的iterable可以在迭代期间改变大小,这会在Python中导致未定义的行为,而不是你想要发生的事情。不过,您可以安全地迭代deque
,首先获取mutex
的内部Queue
:
elements = Queue.Queue()
# populate the queue
with elements.mutex:
for elem in list(elements.queue):
# print elem
这样,在迭代时,将阻止所有其他线程在Queue
中添加或删除元素。
现在,这与使用deque
无关 - 这是完全有效的事情。只是在使用deque
的内部Queue.Queue
的情况下,您需要小心。