python - 如果`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
存在呢?是需要更多的安全功能还是性能问题?
解决方案
在 GitHub 问题之一中的此评论中有此问题的答案:
gevent 的 Queue 是直接按照 gevent 原语实现的,而不是
threading
像标准库 Queue 必须做的那样通过猴子补丁库的抽象,而 gevent 的 Queue 可以利用某些操作不能被其他 greenlet 中断的事实。这使它减少了开销并提高了性能。即使不使用猴子补丁,gevent 的队列也与 gevent 和 greenlets 兼容,而标准库 Queue 不使用并且需要猴子补丁。不是每个人都喜欢猴子补丁。
gevent的Queue还有一个稍微丰富的接口,比如可以迭代。
推荐阅读
- unit-testing - Kotlin - Android Studio 中的 Java 代码覆盖率显示 0% NOT WORKING
- linux - 如何在多个用户的家中创建目录?
- c - 跳过我输入用户名的输出
- javascript - 渲染
- 与 array.map 不工作:地图返回未定义的返回语句
- sql-server - 如何在选择查询中不选择第三行
- javascript - 从特定标签中删除所有文本
- java - 登录后带有spring boot的spring security无法重定向
- node.js - 为猫鼬正确打印正确的 aws cloudwatch
- loops - 将具有两个连续“尾”递归调用的函数转换为迭代函数
- javascript - 允许我显示特定数据的按钮