python - Queue.Queue 与 collections.deque

我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。

Python 至少有两个队列类,Queue.Queuecollections.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.Queuecollections.deque 有不同的用途。 Queue.Queue 旨在允许不同线程使用排队的消息/数据进行通信,而 collections.deque 仅用作数据结构。这就是为什么 Queue.Queueput_nowait()get_nowait()join() 等方法的原因,而collections.deque 没有。 Queue.Queue 不打算用作集合,这就是它缺少 in 运算符之类的原因。

归结为:如果您有多个线程并且希望它们能够在不需要锁的情况下进行通信,那么您正在寻找 Queue.Queue;如果您只想将队列或双端队列作为数据结构,请使用 collections.deque

最后,访问和操作 Queue.Queue 的内部双端队列是在玩火——你真的不想这样做。

https://stackoverflow.com/questions/717148/

相关文章:

python - 通过 Python 在 Linux 上的进程列表

python - 如何让 Pylint 识别 NumPy 成员?

python - 检查字符串是否可以在 Python 中转换为 float

linux - 发送电子邮件的 Shell 脚本

linux - 如何在单个命令中创建目录并授予权限

linux - 对于高级用户来说,有哪些优秀的 Linux/Unix 书籍?

python - 如何在 Python 中获取 PATH 环境变量分隔符?

python - 为什么 Python 3.x 的 super() 有魔力?

python - 为什么 print 在 lambda 中不起作用?

python - 如何正确使用单元测试的 assertRaises() 和 NoneType 对象?