存在一个问题Why do we need gevent.queue?,该问题询问gevent.queue.Queue
的必要性,即没有并行性,只有与gevent
并发。正确,答案说明:
[...]您可能想要确保一系列语句自动执行[...]
因此,每个方法都应该是原子的,这解释了为什么我们需要一个队列对象而不是“常规”列表。但是,根据Python文档https://docs.python.org/3/library/queue.html,queue.Queue
对象已经具有这些安全功能:
当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。该模块中的Queue类实现了所有必需的锁定语义。
那么当gevent.queue.Queue
已经存在时,为什么会有queue.Queue
?是需要更多安全功能还是性能问题?
答案 0 :(得分:0)
在GitHub问题之一中,this comment中对此问题有一个答案:
gevent的Queue是直接根据gevent原语实现的,而不是像标准库Queue那样必须经过猴子修补的
threading
库的抽象,并且gevent的Queue可以利用以下事实:操作不能被其他greenlet中断。这样可以减少开销并提高性能。gevent的Queue与gevent和greenlets兼容,即使不使用猴子补丁,而标准库Queue也不使用,并且需要猴子补丁。并非每个人都喜欢猴子补丁。
gevent的Queue还具有稍微丰富的界面,例如可以进行迭代。