Gevent 1.3的新功能#
有关更改内容的详细信息,请参阅 1.3版的更改 。这份文件总结了自 gevent 1.2 。
Gevent 1.3是对性能、调试和监控以及平台支持的重要更新。它引入了一个(可选) libuv 循环实现,并在Windows上支持PyPy。看见 事件循环实现:libuv和libev 想要更多。
自GEvent 1.2.2以来,已有大约450个来自六个贡献者的提交。近100个拉取请求和100多个问题已关闭。
平台支撑#
gevent 1.3在cpython上支持python 2.7、3.4、3.5、3.6和3.7 (python.org) 翻译。它还支持 PyPy2 5.8.0及以上(推荐PYPY2 5.10或更高)和PYPY3 5.10.0。
小心
python 2.7.8及以下(python 2.7不带现代 ssl
模块),不再测试或支持。支持代码保留在此版本中,并且可以在此类实现上安装gevent,但不支持此类用法。对python 2.7.8的支持将在下一个主要版本的gevent中删除。
备注
Pypy现在在Windows上支持libuv循环实现。
python 3.7现在正在发布,gevent使用3.7b4进行测试,这是python3.7的最后一个测试版。
为了便于在Windows、OS X和Linux上安装,除了源代码外,gevent 1.3还作为预编译的二进制轮子分发。
备注
在Linux上,如果希望使用libuv循环实现,则需要从源代码安装gevent。这是因为 manylinux1 分布式车轮的规范不支持libuv。CFFI类库 must 在生成时安装。
Greenlet属性#
Greenlet
对象获得了一些有用的新属性:
Greenlet.spawning_greenlet
是创造这个 greenlet 的 greenlet 。parent
一个 greenlet 几乎总是 gevent 的hub
这对于理解greenlet关系更有用。Greenlet.spawn_tree_locals
是通过繁殖树维护的值字典(即,基于特定greenlet的所有子代)spawning_greenlet
)。这便于在一组greenlet之间共享值,例如,处理请求所涉及的所有greenlet。Greenlet.spawning_stack
是一个frame
-类似于捕获greenlet的创建位置并可以传递给traceback.print_stack()
.Greenlet.minimal_ident
是一个小整数,在所有的小绿叶中都是唯一的。Greenlet.name
默认情况下是在greenlet的repr中打印的字符串。
“生”小菜 spawn_raw
默认为 spawning_greenlet
和 spawn_tree_locals
.
这些额外的数据是由新的 gevent.util.print_run_info()
功能。
性能#
GEVENT 1.3在CPython上使用Cython来编译几个性能关键的模块。因此,整体性能得到了提高。具体来说,队列速度快5倍,池速度快10-20%,并且 gevent.local.local
快了40倍。见 pull request #1156 , pull request #1155 , pull request #1117 和 pull request #1154 .
表现更好的回调#
在gevent 1.2.2中,事件循环回调(包括 sleep(0)
)将按顺序运行,直到我们全部运行它们,或者直到我们运行10000。简单地计算回调的数量可能会导致在任意的、未绑定的时间段内没有IO被服务。为了纠正这一点,GEvent 1.3介绍了 gevent.getswitchinterval
在检查IO之前,将仅(大约)运行该时间段的回调。(这类似于python 2计算线程开关之间字节码指令的方式,但python 3使用的是更确定的计时器方法。)希望这将导致“更平滑”的应用程序行为和更少的陷阱。见 issue #1072 了解更多详细信息。
监视和调试#
许多新的greenlet属性对于监控和调试gevent应用程序很有用。gevent现在还可以(可选)监视调用阻塞函数和暂停事件循环的greenlet,并定期检查应用程序是否超过了配置的内存限制。见 监控和调试gevent应用程序 更多信息。
新的纯python DNS解析程序#
这个 dnspython 库是针对 名称解析(DNS) . 基准测试表明它比现有的C战神分解器更快,而且在Pypy上也更稳定。C-ARES分解器可能会被弃用,并在将来被移除。
API添加#
许多API在此版本中提供了稍微扩展的功能。在整个文档中查找“在1.3版中更改”或“在1.3版中添加”以了解详细信息。
注意事项的一些变化:
低级观察程序对象现在有一个
close()
方法 must 立即处理本地(libev或libuv)资源。gevent.monkey.patch_all
默认为修补Event
.gevent.subprocess.Popen
在python 2中接受与在python 3中相同的关键字参数。gevent.monkey.patch_all
以及各种单独的补丁函数,在补丁完成时发出事件。这可用于扩展新模块的修补过程。patch_all
还将所有未知关键字参数传递给这些事件。见 pull request #1169 .模块
gevent.events
包含Gevent的某些部分可以发出的事件。它将使用zope.event
如果安装了。
库更新#
与gevent捆绑在一起的一个C库已经更新。C-ARES已从1.13.0更新为1.14.0 (c-ares release notes )
兼容性#
此版本旨在与1.2.x兼容,不更改客户端源代码,只要使用了不推荐使用的和受支持的接口(与往常一样,内部的、未记录的实现细节可能已经更改)。以下是一些特定的兼容性说明。
这个 resolvers 已被重构。因此,
gevent.ares
,gevent.resolver_ares
和gevent.resolver_thread
已弃用。在GEVENT_RESOLVER
环境变量继续像以前一样工作。内部模块
gevent._threading
被显著地重构。顾名思义,这是一个内部模块,并不打算作为公共API的一部分,但已经观察到了这种用法。模块
gevent.wsgi
已删除。使用gevent.pywsgi
相反。gevent.wsgi
只是一个别名gevent.pywsgi
自GEvent 1.0A1(2011年)起。