1.5版的更改#

1.5.0(2020-04-10)#

1.5a4(2020-03-23)#

平台和包装更新#

  • Python版本更新:gevent现在用cpython3.6.10、3.7.7和3.8.2进行了测试。它也用PyPy2 7.3和pypy3.6 7.3进行了测试。

  • 用于编译C扩展的include目录已经过调整,目的是使它更容易使用Python的旧调试版本。看到了吗 issue #1461 .

  • 二进制控制盘和已安装的包不再包含生成的C源文件和头文件。此外,Cython.pxd文件也被排除在外,它们从未被记录在案。如果你错过了这些,请提交一个问题。

库和依赖项更新#

  • 将libev从4.25升级到4.31并更新其嵌入的 config.guess 最新消息。看到了吗 issue #1504 .

    重要

    libev,与 EV_VERIFY >= 2 ,现在在IO监视程序启动时执行文件描述符的验证 and 当他们被阻止的时候。如果您首先关闭一个文件描述符,然后才停止相关的观察程序,libev将中止该进程。

    使用标准的gevent套接字和文件对象可以自动处理这一问题,但是如果您直接使用IO watchers,则需要注意这一点。

    双轮gevent分配 设置 EV_VERIFY 别有这个问题。

  • 使libuv和libev使用Python内存分配器。这有助于调试。事件库在启动时分配少量内存。分配函数必须采用GIL,但由于实际分配的数量有限,因此预计这不会成为一个瓶颈。

  • 更新捆绑包 tblib 库升级到未发布的1.7.0版本。唯一的改变是添加更多属性到 FrameCode 对象以实现pytest兼容性。看到了吗 pull request #1541 .

潜在的突破性变化#

  • Remove the magic proxy object gevent.signal. This served as both a deprecated alias of gevent.signal_handler and the module gevent.signal. This made it confusing to humans and static analysis tools alike. The alias was deprecated since gevent 1.1b4. See issue #1596.

其他#

  • 制作 gevent.subprocess.Popen.communicate 引发通过从进程中读取而引发的异常,如标准库。特别是,在python3下,如果进程输出被解码为文本,那么现在可能会引发 UnicodeDecodeError . 报告时间: issue #1510 作者:奥弗科伦。

  • 制作 gevent.subprocess.Popen.communicate 关闭文件时要更加小心。如果发生超时错误,则再次调用 communicate 可能无法关闭管道。

  • 添加 gevent.contextvars ,合作版本 contextvars . 这适用于所有Python版本。在Python3.7及更高版本上,其中 contextvars 是一个标准的库模块,默认情况下是monkey补丁。看到了吗 issue #1407 .

  • 使用 selectors.PollSelector 作为 selectors.DefaultSelector 猴子修补后如果 select.poll 被定义。之前,gevent用 selectors.SelectSelector ,它有一组不同的限制(例如,在某些平台上,比如glibc Linux,它有一个硬编码的限制,即只能使用小于1024的文件描述符)。看到了吗 issue #1466 报道者:黄森美。

  • 如果在gevent解析程序初始化之前已导入dnspython解析程序,请使dnspython解析程序正常工作。报告时间 issue #1526 克里斯·乌茨和乔希·祖奇。

1.5a3(2020-01-01)#

  • Python版本更新:gevent现在使用cpython2.7.17、3.5.9、3.6.9、3.7.5和3.8.0(最终版)进行了测试。它还用PyPy2 7.2和pypy3.6 7.2进行了测试

  • 使用猴子补丁修复 threading.Lockthreading.RLock 对象作为旋转锁,通过调用 sleep(0) 如果他们在非阻塞调用中未能获得锁。这允许其他回调运行以释放锁,模拟抢占式线程。不建议使用自旋锁,但可能已经在为线程编写的代码中完成了,尤其是在Python3上。看到了吗 issue #1464 .

  • 修复信号量(和猴子补丁线程锁)是公平的。这就消除了青菜出现饥饿的可能性。作为这种变化的一部分,低层方法 rawlink 事件和AsyncResult现在总是在调用链接对象时删除它,因此 unlink 有时可以优化。看到了吗 issue #1487 .

  • 制作 gevent.pywsgi 支持 Connection: keep-alive 在HTTP/1.0中。基于 pull request #1331 谭楚汉。

  • 使用修复潜在的崩溃 gevent.idle() 当使用libuv时。看到了吗 issue #1489 .

  • 使用libuv异步观察程序修复一些潜在的崩溃。

  • 制作 ThreadPool 不断提高 InvalidThreadUseError 什么时候? spawn 从与创建线程池的线程不同的线程调用。这一点从未被允许,但却被前后矛盾地强制执行。在gevent1.3及之前的版本中,这将始终引发“greenlet错误:无效线程开关”,或者 LoopExit . 在gevent 1.4上 能够 提升 LoopExit ,这取决于任务的数量,但从另一个线程调用它可能会损坏libev或libuv的内部结构。

  • 从threadpool模块中删除一些未记录的、不推荐使用的函数。

  • libuv:在没有活动的IO观察程序或计时器的情况下,修复一个可以同时产生多个greenlet的缓慢性,而不会屈服于事件循环。如果启动greenlets所花费的时间超过了切换间隔,并且没有其他活动的监视程序,那么在生成批处理之间,默认的IO轮询时间大约为.3s。这在理论上可以适用于任何非交换回调。这可以在综合基准测试和其他特殊情况下产生,但实际应用不太可能受到影响。看到了吗 issue #1493 .

  • 修复在运行脚本或模块时使用线程池的问题 python -m gevent.monkey . 以前它将使用greenlets而不是本机线程。看到了吗 issue #1484 .

  • 修复FFI后端中的潜在崩溃,如果在事件循环的回调过程中关闭并停止观察程序,然后引发异常。如果集线器 handle_error 例如,函数的定制很差。看到了吗 issue #1482

  • 制作 gevent.killall 阻止那些还没有运行过的绿精灵。这使它与 Greenlet.kill() . 见 issue #1473 科切尔怪物报道。

  • 制作 gevent.spawn_raw 设置 loop 属性。这使得他们可以使用更多的gevent api,特别是 gevent.killall() . 它们已经有了字典,但这可能会使它们稍微大一点,这取决于平台(在CPython 2.7到3.6上,一个属性没有明显区别,但在CPython 3.7和3.8上,字典最初是空的,只在添加了属性后才分配空间;但是它们仍然比早期版本小)。

文件对象更改#

小心

对于依赖于旧行为的应用程序,这里可能会有突破性的变化。旧的行为是不够具体和不一致的,实际上只与'wb'和'rb'模式一致,所以大多数应用程序不应该受到影响。

  • 文件对象 (FileObjectPosixFileObjectThread )现在一直支持文本和二进制模式。如果模式中没有给出“b”或“t”,则它们将读写本机字符串。如果给定't',它们将始终使用unicode字符串,而'b'将始终使用字节字符串。 (FileObjectPosix 已经这样工作了。)看到了吗 issue #1441 .

  • 文件对象接受 编码错误换行符 论据。在Python2上,只有在“t”处于模式时才使用它们。

  • 的默认模式 FileObjectPosix 从改变 rb 简单地说 r ,以便与其他文件对象和标准保持一致 openio.open() 功能。

  • 固定 FileObjectPosix 不恰当地从多个小菜中使用。以前这是通过强制缓冲来隐藏的 RuntimeError .

1.5a2(2019-10-21)#

  • 添加对cpython3.8.0的支持。(Windows控制盘尚不可用。)

  • 更新至Cython 0.29.13和cffi 1.12.3。

  • 添加一个 --module 选择权 gevent.monkey 允许运行Python模块而不是脚本。看到了吗 pull request #1440 .

  • 改进在python3上连接主线程的方式。

  • 实施 SSLSocket.verify_client_post_handshake() 何时可用。

  • 修复支持TLS1.3时的测试。

  • 在后门服务器中禁用Nagle算法。这可以提高交互响应时间。

  • 在python3.7.4上测试。有一些重要的SSL修复测试。

1.5A1(2019年5月2日)#

平台和包装更新#

  • python版本更新:gevent现在使用cpython 2.7.16、3.5.6、3.6.8和3.7.2进行测试。它还使用PYPY2 7.1和PYPY 3.6 7.1进行了测试(PYPY 7.0和7.1无法在Travis CI上运行SSL测试)。

  • 对python 3.4的支持已被删除,因为该版本不再支持upstream。

  • gevent二进制车轮现在是manylinx2010,包括libuv支持。安装它们需要PIP 19。见 issue #1346 .

  • Gevent现在使用Cython 0.29.6和CFFI 1.12.2进行编译。

  • gevent源包括一个pyproject.toml文件,指定构建需求并启用构建隔离。要利用这一点,需要PIP 18或更高版本。见 issue #1180 .

  • libev cffi:让编译器填写 nlink_t 对于 st_nlink 在里面 struct stat 而不是自己去猜测。报告时间: issue #1372 安德烈亚斯·施瓦布。

  • 移除 Makefile . 它最有用的命令, make cleanmake distclean ,现在可以用跨平台的方式 python setup.py cleanpython setup.py clean -a ,分别。剩下的 Makefile 包含已移动到的travis ci命令 .travis.yml .

  • 贬低 EMBEDLIBEV_EMBED 等等,构建时间环境变量。相反,使用 GEVENTSETUP_EMBEDGEVENTSETUP_EMBED_LIBEV . 见 issue #1402 .

  • cffi后端现在遵循嵌入构建时间设置。这允许在不嵌入libuv的情况下构建libuv后端(在Windows上除外)。

  • 支持测试资源。这允许禁用使用网络的测试。看见 限制资源使用 想要更多。

库和依赖项更新#

  • 将libuv从1.24.0升级到1.27.0。

  • 将libev从4.23升级到4.25并更新其嵌入版本 config.guess 最新。

  • 将c-ares从1.14升级到1.15。

  • Dnspython解析器现在需要大于等于1.16.0的Dnspython。

错误修复#

  • python 3.7子进程:copy a STARTUPINFO 作为参数传递。由AndCycle贡献 pull request #1352 .

  • 子过程: WIFSTOPPEDSIGCHLD 现在处理以确定 Popen.returncode . 请参阅https://bugs.python.org/issue29335

  • 子进程:如果重定向的FDS位于 pass_fds . 这是 a bugfix from Python 3.7 应用于所有运行Gevent的版本。

  • 修复处于无效状态(父级无效)的greenlet上的某些操作,以引发 TypeError 早而不是 AttributeError 稍后。这在使用赛通的CPython上也稍快。灵感来自 issue #1363 如Carson IP所报告。这意味着,一些极端的角落案例,可能已经通过更换一个格林莱特的父母的东西,现在不再是一个GEvent枢纽了。

  • 修复:The spawning_stack 对于cpython上的greenlets,在更多情况下应该有正确的行号。见 pull request #1379 .

增强功能#

  • 结果 gevent.ssl.SSLSocket.makefile() 可以用作Python2上的上下文管理器。

  • python 2:如果 _thread_ 模块从 futures 已经在monkey补丁时导入,也要补丁这个模块要一致。这个 pkg_resources 程序包导入此,并且 pkg_resources 通常在python 2的早期导入命名空间包,因此如果 futures 如果安装了,可能会发生这种情况。

  • python 2:当 io.BufferedWriter 包在插座上。达米安·图鲁德在 issue #1318 .

  • 在创建非常深的繁殖树时,避免使用无限内存。报告时间: issue #1371 由德姆劳森。

  • 胜利:制造 examples/process.py 做一些有用的事。见 pull request #1378 作者:罗伯特·伊恩努奇。

  • 产卵的小菜可以快10%。见 pull request #1379 .