为什么使用Queue.Queue的deque被认为是危险的?

时间:2014-10-03 22:38:49

标签: python queue

在我将一些dict存储在Queue.Queue的程序中,我必须列出每个条目而不将其从队列中删除。现在我使用此代码片段迭代条目:

elements = Queue.Queue()
# populate the queue

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

Lib/Queue.pyLib/collections.py的代码中,我发现queuedeque的代理,以及answer的“Python:Queue.Queue”提到vs. collections.deque“不直接使用deque

有没有特别的理由不使用deque?希望有人可以详细说明一下。

1 个答案:

答案 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的情况下,您需要小心。