我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。
Python 至少有两个队列类,Queue.Queue和collections.deque,前者似乎在内部使用后者。两者都声称在文档中是线程安全的。
Queue.Queue
collections.deque
但是,队列文档还指出:
collections.deque 是无界队列的替代实现,具有 不需要锁定的快速原子 append() 和 popleft() 操作。
我想我不太明白:这是否意味着双端队列毕竟不是完全线程安全的?
如果是这样,我可能无法完全理解这两个类之间的区别。我可以看到 Queue 添加了阻塞功能。另一方面,它失去了一些双端队列特性,比如对 in-operator 的支持。
直接访问内部双端队列对象是
x in Queue().deque
线程安全?
另外, 当双端队列已经是线程安全的时,为什么队列要为其操作使用互斥锁?
Queue.Queue并collections.deque服务于不同的目的。Queue.Queue 旨在允许不同的线程使用排队的消息/数据进行通信,而仅用作数据collections.deque结构。这就是为什么Queue.Queue有像put_nowait(),get_nowait()和join(), 而collections.deque没有的方法。Queue.Queue不打算用作集合,这就是为什么它缺少in运算符之类的原因。
put_nowait()
get_nowait()
join()
in
归结为:如果您有多个线程并且您希望它们能够在不需要锁的情况下进行通信,那么您正在寻找Queue.Queue; 如果您只想将队列或双端队列作为数据结构,请使用collections.deque.
最后,访问和操作 a 的内部双端队列Queue.Queue是在玩火——你真的不想那样做。