如果`queue.Queue`已经存在并且是线程安全的,为什么会有`gevent.queue.Queue`?

时间:2019-06-25 21:22:29

标签: python multithreading concurrency queue gevent

存在一个问题Why do we need gevent.queue?,该问题询问gevent.queue.Queue的必要性,即没有并行性,只有与gevent并发。正确,答案说明:

  

[...]您可能想要确保一系列语句自动执行[...]

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

  

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

那么当gevent.queue.Queue已经存在时,为什么会有queue.Queue?是需要更多安全功能还是性能问题?

1 个答案:

答案 0 :(得分:0)

在GitHub问题之一中,this comment中对此问题有一个答案:

  

gevent的Queue是直接根据gevent原语实现的,而不是像标准库Queue那样必须经过猴子修补的threading库的抽象,并且gevent的Queue可以利用以下事实:操作不能被其他greenlet中断。这样可以减少开销并提高性能。

     

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

     

gevent的Queue还具有稍微丰富的界面,例如可以进行迭代。