首页 > 解决方案 > 如果`queue.Queue`已经存在并且是线程安全的,为什么还有`gevent.queue.Queue`?

问题描述

有这个问题为什么我们需要gevent.queue?它询问是否有必要gevent.queue.Queue考虑没有并行性,而只有与gevent. 正确地,答案解释了:

[...] 您可能希望确保一系列语句以原子方式执行 [...]

所以每个方法都应该是原子的,这解释了为什么我们需要一个队列对象而不是一个“常规”列表,例如。但是,根据 Python 文档https://docs.python.org/3/library/queue.html,一个queue.Queue对象已经具有这些安全功能:

当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。该模块中的 Queue 类实现了所有必需的锁定语义。

那么为什么在已经存在的gevent.queue.Queue时候queue.Queue存在呢?是需要更多的安全功能还是性能问题?

标签: pythonmultithreadingconcurrencyqueuegevent

解决方案


在 GitHub 问题之一中的此评论中有此问题的答案:

gevent 的 Queue 是直接按照 gevent 原语实现的,而不是threading像标准库 Queue 必须做的那样通过猴子补丁库的抽象,而 gevent 的 Queue 可以利用某些操作不能被其他 greenlet 中断的事实。这使它减少了开销并提高了性能。

即使不使用猴子补丁,gevent 的队列也与 gevent 和 greenlets 兼容,而标准库 Queue 不使用并且需要猴子补丁。不是每个人都喜欢猴子补丁。

gevent的Queue还有一个稍微丰富的接口,比如可以迭代。


推荐阅读