【问题标题】:Why is using deque of Queue.Queue considered dangerous?为什么使用 Queue.Queue 的双端队列被认为是危险的?
【发布时间】:2014-11-29 00:43:51
【问题描述】:

在我将一些dict 存储在Queue.Queue 中的程序中,我必须列出每个条目而不将它们从队列中删除。现在我使用这段代码 sn-p 来遍历条目:

elements = Queue.Queue()
# populate the queue

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

Lib/Queue.pyLib/collections.py 的代码中,我发现queuedeque 的代理,并且在“Python:Queue.Queue vs. collections.deque”的answer 中没有提到直接使用deque

有什么特别的理由不使用deque?希望有人能详细说明一下。

【问题讨论】:

  • 我认为您误解了答案。使用collections.deque 没有任何问题,只是在使用Queue 对象时不想使用Queue.deque。那是Queue 对象的内部双端队列,你不应该直接操作它。
  • 在您链接到的问题中的解释相当清楚......如果您只需要一个数据结构,那么一个双端队列就可以了。

标签: python queue


【解决方案1】:

迭代Queue.Queue 的内部deque 很危险的原因是,当您迭代它时,另一个线程可能会出现并从deque 添加或删除项目(通过使用queue.put /queue.get)。这意味着您的可迭代对象可能会在迭代期间更改大小,这会导致 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 的情况下,您需要小心。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2011-11-09
    • 1970-01-01
    • 2010-09-16
    • 2020-04-04
    • 2021-08-30
    • 2012-01-13
    • 2020-04-19
    相关资源
    最近更新 更多