我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。
Python 至少有两个队列类,Queue.Queue
和 collections.deque
,前者似乎在内部使用后者。两者都在文档中声称是线程安全的。
但是,队列文档也指出:
collections.deque is an alternative implementation of unbounded queues with fast atomic append() and popleft() operations that do not require locking.
我想我不太明白:这是否意味着双端队列毕竟不是完全线程安全的?
如果是这样,我可能无法完全理解这两个类之间的区别。我可以看到 Queue 添加了阻塞功能。另一方面,它失去了一些双端队列功能,例如对 in-operator 的支持。
直接访问内部deque对象,是
x in Queue().deque
线程安全?
另外,为什么在 deque 已经是线程安全的情况下,Queue 使用互斥锁来执行它的操作?
最佳答案
Queue.Queue
和 collections.deque
有不同的用途。 Queue.Queue 旨在允许不同线程使用排队的消息/数据进行通信,而 collections.deque
仅用作数据结构。这就是为什么 Queue.Queue
有 put_nowait()
、get_nowait()
和 join()
等方法的原因,而collections.deque
没有。 Queue.Queue
不打算用作集合,这就是它缺少 in
运算符之类的原因。
归结为:如果您有多个线程并且希望它们能够在不需要锁的情况下进行通信,那么您正在寻找 Queue.Queue
;如果您只想将队列或双端队列作为数据结构,请使用 collections.deque
。
最后,访问和操作 Queue.Queue
的内部双端队列是在玩火——你真的不想这样做。
https://stackoverflow.com/questions/717148/