1.3版的更改#

1.3.7(2018年10月12日)#

  • 格式化运行信息不再包括 gevent.local.local 在greenlet中没有值的对象。见 issue #1275 .

  • 在Pywsgi的输入读取函数中,非块体的负长度是固定的。报告时间: issue #1274 作者:Tzickel。

  • 将libuv从1.22.0升级到1.23.2。

  • 通过修补libuv,修复了在cpython 2的文本模式下在Windows上打开文件的问题。见 issue #1282 由Wiggin15报告。

1.3.6(2018-08-17)#

  • GEvent现在取决于Greenlet 0.4.14或更高版本。1.3.5及以下版本的gevent二进制车轮必须在python 3.7上安装greenlet 0.4.13,否则会崩溃。Alexey Stepanov在 issue #1260 普基特尼斯在 issue #1261 .

  • gevent.local.local 子类正确支持 @staticmethod 功能。由Brendan Powers在 issue #1266 .

1.3.5(2018年7月16日)#

  • 将捆绑libuv从1.20.1更新为1.22.0。

  • 在Appveyor上测试python 3.7。修复波本的处理 close_fds 关于3.7的论证。

  • 更新在Travis上测试的python版本,包括pypy到6.0。见 issue #1195 .

  • gevent.queue 进口 _PySimpleQueue 而不是 SimpleQueue 这样它就不会阻塞事件循环。 gevent.monkey.patch_all()queue . 这解决了 concurrent.futures.ThreadPoolExecutor 也。报告时间: issue #1248 由WWQGTXX和 issue #1251 作者:Pyld。

  • gevent.socket.socket.connect() 不将端口(服务)传递给 socket.getaddrinfo() 当它解决 AF_INETAF_INET6 地址。(标准库也没有。)这修复了Solaris上的问题。报告时间: issue #1252 作者:Wiggin15。

  • gevent.socket.socket.connect() 适用于更多地址系列,尤其是af_tipc、af_netlink、af_蓝牙、af_alg和af_vsock。

1.3.4(2018年6月20日)#

  • 更小心发行 MonkeyPatchWarning 用于SSL导入。现在,我们只在检测到导致递归错误的一个特定条件时才发布它。这可能产生假阴性,但应减少或消除假阳性。

  • 基于测量和讨论 issue #1233 ,调整方式 gevent.pywsgi 生成HTTP块。这是为了减少网络开销,特别是对于较小的块大小。

  • gevent.pywsgi . 见 pull request #1241 .

1.3.3(2018年6月8日)#

  • gevent.sleep() 更新循环在睡眠前的当前时间的概念,以便睡眠持续时间更接近已用(挂钟)时间。 gevent.Timeout 也一样。由Champax和Fop在 issue #1227 .

  • 修复一个 UnboundLocalError 在SSL服务器中,当包装套接字时会引发错误。报告时间: issue #1236 作者:Kochemonster。

1.3.2.post0(2018-05-30)#

  • 修复manylinux二进制轮子中阻止某些导入工作的打包错误。见 issue #1219 .

1.3.2(2018-05-29)#

1.3.1(2018年5月18日)#

1.3.0(2018-05-11)#

  • python 3.7通过了自动内存泄漏检查。见 issue #1197 .

  • 将autoconf的config.guess和config.sub更新为c-ares和libev的最新版本。

  • gevent.local.local 可以实例化混合在ABC中的子类。报告时间: issue #1201 鲍勃·乔丹。

1.3B2(2018-05-03)#

  • 在Windows上,cffi现在是一个依赖项,因此libuv后端在默认情况下确实可以使用。

  • 修复一个错误,检测在未安装PSUTIL时是否可以使用内存监控功能。

  • gevent.subprocess.Popen 使用 /proc/self/fd (在Linux上)或 /dev/fd (在BSD上,包括MacOS)查找要关闭的文件描述符 close_fds 是真的。这与添加到python 3的优化匹配(并将其返回到python 2.7),使进程生成速度快9倍。另外,在python 3上,由于不再支持python3.3,我们还可以优化以下情况: close_fds 为假(不是默认值),使进程生成速度快38倍。最初报告于 issue #1172 作者:奥弗科伦。

  • 捆绑libuv现在是1.20.1,高于1.19.2。见 issue #1177 .

  • 长期弃用和未记录的模块 gevent.wsgi 被移除。

  • 添加 gevent.util.assert_switches 以监控功能为基础。修正 issue #1182 .

  • 活动集线器的一个已启动的监视线程现在存活在一个分叉中。见 issue #1185 .

  • 用于各种监控功能的greenlet跟踪函数现在使用cython进行编译,以大大降低开销。见 pull request #1190 .

  • libuv现在收集所有挂起的观察程序,并在循环迭代结束时使用uv_run_一次运行它们的回调。这就消除了需要修补libuv以保证greenlet安全。它还意味着零持续时间计时器再次成为实际的计时器观察者(而不是变成检查观察者);新添加的零持续时间计时器无法阻止事件循环,因为它们在安全时间之前不会运行。

  • python 3.7.0b4现在是python3.7的测试和支持版本。PYPY 6.0已经过测试,尽管CI继续使用5.10。

1.3b1(2018年4月13日)#

依赖关系#

  • Cython 0.28.2现在用于从源代码签出构建gevent。

  • 捆绑libuv现在是1.19.2,高于1.18.0。

平台支撑#

  • 在python 3.7.0b3上进行Travis CI测试。

  • 如果安装了cffi,Windows现在默认为libuv后端。见 issue #1163 .

漏洞修补#

  • 在python 2上,当猴子修补时 threading.Event ,也可以对底层类进行monkey修补, threading._Event . 一些代码可能正在进行类型检查。见 issue #1136 .

  • 修复libuv io watchers对仅停止的监视程序感兴趣的事件的轮询,减少CPU使用。报告时间: issue #1144 由WWQGTXX提供。

增强功能#

  • 添加额外的优化以生成greenlet,使其速度超过1.3a2。

  • 在libuv cffi扩展中使用强类型的watcher回调。这可以防止许多编译器警告。

  • 当gevent将时间戳作为错误消息的一部分打印时,它现在是由rfc339指定的UTC格式。

  • 退出的线程池线程现在总是销毁其集线器(如果创建了集线器)。这可以防止某些形式的资源泄漏(尤其是新的监控功能报告的阻塞功能)。

  • 中心对象现在包括 name 他们报告中的属性。

  • 用于greenlet和线程的池具有较低的开销,特别是用于 map . 见 pull request #1153 .

  • 未记录的内部实现类 IMapIMapUnordered 现在使用cython编译类,进一步减少了 [Thread]Pool.imap .

  • 班级 gevent.event.Eventgevent.event.AsyncResult 与赛通一起编译以提高性能,正如 gevent.queue 模块和 gevent.hub.Waiter 以及轮毂本身的某些时间敏感部分。请报告任何兼容性问题。

  • python -m gevent.monkey <script> 接受更多值 <script> 包括到包或编译字节码的路径。报告时间: issue #1157 埃迪·林德。

  • 为分离通信添加一个简单的事件框架。它使用 zope.event 如果安装了。

  • gevent.monkey 支持事件订阅服务器和安装工具入口点形式的插件。见 pull request #1158issue #1162 . 必须在运行时安装SETUPTOOLS才能使其入口点正常工作。

监视和调试#

  • 引入配置变量 gevent.config.track_greenlet_tree (阿卡 GEVENT_TRACK_GREENLET_TREE )允许禁用greenlet树功能,应用程序的greenlet生成对性能至关重要。这会将生成性能恢复到1.2级。

  • 为每个集线器添加可选的监视线程。启用后,此线程(默认情况下)将查找阻止事件循环超过0.1秒的greenlet。您可以向此线程添加自己的定期监视功能。集合 GEVENT_MONITOR_THREAD_ENABLE 使用它,以及 GEVENT_MAX_BLOCKING_TIME 配置阻塞间隔。

  • 监视线程在检测到某些情况时会发出事件,如循环阻塞或超出内存限制。

  • 添加在超过阈值时监视内存使用和发出事件的设置,然后更正。当内存超过配置的限制时,gevent当前不提供要做什么的策略。 psutil 必须安装才能使用。见 pull request #1150 .

1.3A2(2018年3月6日)#

依赖关系#

  • Cython 0.28b1或更高版本现在需要从源代码签出中构建Gevent(Cython是 not 需要从Pypi构建源分发)。

  • 更新c-ares至1.14.0。见 issue #1105 .

  • Gevent现在 要求 libuv的补丁版本。虽然以前不支持使用非嵌入式libuv构建gevent,但现在不可能实现。见 issue #1126 .

平台支撑#

  • Travis CI在python 3.7.0b2和pypypy 2.7 5.10.0和pypypy 3.5 5.10.1上进行测试。

建立变化#

  • 在未安装Cython的情况下,从源分发(PYPI)修复建筑。

增强功能#

监视和调试#

  • greenlet对象现在跟踪它们的生成父greenlet和生成它们的代码位置,除了维护“本地生成树”映射之外。这增加了一些相对的运行时开销,但绝对数仍然相对较小。基于贝宝的建议和Mahmoud Hashemi和Kurt Rose的评论。见 issue #755pull request #1115 . 一如既往,我们感谢您的反馈。

  • Greenlet对象现在有一个 minimal_ident 属性。它的功能与 Thread.identid 通过在greenlet对象保持活动时唯一地标识它,它可以在greenlet对象死后重用。它是不同的,因为它是小的和连续的。基于贝宝的建议和Mahmoud Hashemi和Kurt Rose的评论。见 issue #755 . 一如既往,我们感谢您的反馈。

  • gevent.Greenlet 对象现在有一个 gevent.Greenlet.name 包含在默认repr中的属性。

  • 包括的值 gevent.local.local 与每个greenlet关联的对象 gevent.util.format_run_info .

  • 添加 gevent.util.GreenletTree 想象绿叶树。这是用的 gevent.util.format_run_info .

子流程#

  • 制作 gevnt.subprocess.Popen 接受 restore_signals 所有版本的python和python 2上的关键字参数默认为false。它以前在所有版本上都默认为true;现在在python 3上只默认为true。python 2中的标准库没有这个参数,它与信号相关的行为是未记录的,但是有一些代码已知依赖于在python2下未恢复的信号。初始报告和修补 pull request #1063 弗洛里安·马盖恩。

  • 允许 gevent.subprocess.Popen 接受关键字参数 pass_fdsstart_new_session 在python 2下。它们始终具有与Python3相同的默认值,即空tuple和false,但现在可以被Python2访问。

  • 支持 capture_output 在中添加到python 3.7的参数 gevent.subprocess.run() .

配置#

  • 将所有gevent配置集中在一个对象中 gevent.config ,允许通过代码配置gevent,而不是 必要地 环境变量,也为文档提供了一个集中的位置。见 issue #1090 .

    • 新的 GEVENT_CORE_CFFI_ONLY 环境变量已替换为现有的 GEVENT_LOOP 环境变量。这个变量可以取 libev-cextlibev-cffilibuv-cffi ,(或者是按优先顺序排列的列表,或者是点式名称;它也可以用python代码分配给位于 gevent.config.loop

    • 这个 GEVENTARES_SERVERS 环境变量已弃用,取而代之的是 GEVENT_RESOLVER_SERVERS . 见 issue #1103 .

漏洞修补#

  • 修复呼叫 shutdown 在封闭的插座上。它在上升 AttributeError ,现在它再次提出正确的 socket.error . 报告时间: issue #1089 作者:Andr_Cimander。

  • 修复如果两个或多个 loop 对象引用了默认事件循环,其中一个被销毁,另一个被销毁,或者(仅在libev c扩展实现中)释放(垃圾收集)。见 issue #1098 .

  • 修复libuv子回调中的争用条件。见 issue #1104 .

其他变化#

  • 内部未记录模块 gevent._threading 已简化。

  • 内部的未记录类 gevent._socket3._fileobject 已删除。见 issue #1084 .

  • 简化libev默认循环和 destroy() 方法。当默认循环被破坏时,可以再次请求它,它将自己重新生成。默认循环是唯一可以接收子事件的循环。

  • 制作 gevent.socket.socket.sendall() 与GEvent 1.1b3中对pypy2所做的相同更改相比,pypy3的速度快了10倍。

  • 对于在python 2上修补ssl发出警告要更加小心。见 issue #1108 .

  • 用libuv在pypypy下处理信号更可靠。见 issue #1112 .

  • 这个 gevent.greenlet 现在使用Cython编译模块,以抵消由于 issue #755 . 请为任何兼容性问题打开问题。见 pull request #1115pull request #1120 .

  • 在cpython上,允许 gevent.Greenletgevent.localgevent.lock 当环境变量 PURE_PYTHON 已设置。除了调试和测试之外,不建议这样做。见 issue #1118 .

  • gevent.select.poll.poll() 现在解释 超时 与-1相同 超时 属于 None 根据标准要求。以前,在libuv上,这与 超时 0。此外,所有 超时 小于零的值解释为 None (就像他们一直在利比夫统治下一样)。见 issue #1127 .

  • 猴子补丁现在默认为补丁 threading.Event .

1.3A1(2018年1月27日)#

依赖关系#

  • Gevent现在用Cython 0.27建造和测试。这是Python3.7支持所必需的。

  • 更新c-ares至1.13.0。见 issue #990 .

平台支撑#

  • 添加对python 3.7a3的初始支持。它与Python3.6具有相同的支持级别。

    • 使用未发布的cython 0.28和greenlet 0.4.13;需要python 3.7a3。

    • 这个 async 函数和类已重命名为 async_ 由于 async 在Python3.7中成为关键字。旧版本的别名仍然存在。见 issue #1047 .

  • 现在在python 3.6.4上测试了gevent。这包括以下修复和更改:

    • 从引发的错误 gevent.subprocess 将有一个 filename 属性集。

    • 这个 threading.Timer 现在,类被猴修补,可以加入。之前在python 3.4及更高版本上,加入 Timer 将挂起进程。

    • gevent.ssl.SSLSocket.unwrap() 其行为更像标准库,包括返回sslsocket并允许传播某些与超时相关的ssl错误。添加的标准库测试 test_ftplib.py 现在通过了。

    • gevent.subprocess.Popen 接受的“类似路径的对象” cwd 所有平台上的参数。以前,这只适用于Python3.6下的POSIX平台。现在,它还可以在Python3.6下的Windows上工作(如预期的那样),并且可以返回到所有以前的版本。

  • LinuxCI现在在pypy3 3.5-5.9.0上进行测试,从pypy3 3.5-5.7.1更新。见 issue #1001 . pypy2从5.7.1更新为5.9.0,python 2.7从2.7.13更新为2.7.14,python 3.4从3.4.5更新为3.4.7,python 3.5从3.5.3更新为3.5.4,python 3.6从3.6.0更新为3.6.4。

  • 放弃对python 3.3的支持。自GEvent 1.2发布以来,该文件仅声称支持3.4+,仅测试了3.4+。这只会删除支持的特洛伊分类器和剩余的测试代码。见 issue #997 .

  • Pypy现在已知使用libuv后端在Windows上运行,但需要注意。有关更多信息,请参阅libuv部分。

  • 出于安全考虑,对python 2.7.8和更早版本(没有现代的ssl实现)的官方支持已经被取消。这些版本不再使用gevent进行测试,但gevent仍然可以安装在它们上面。支持代码将在下一个主要版本的gevent中删除。见 issue #1073 .

建立变化#

  • 从源签出生成gevent时( not 分布式源分布) make 不再需要 Makefile 未使用。两者都不是外部的 cython 命令。相反, cythonize 根据赛通的建议,使用功能。(源分发版从不需要外部命令。)请参见 issue #1076 .

  • gevent.local.local 是用Cython在cpython上编译的。

  • 赛通战神'channel'类不再声明为可以通过命名的C结构公开访问。这样做导致了与C-ARES头文件的冲突。

漏洞修补#

其他变化#

  • Pool.add 现在接受 blockingtimeout 参数,其功能类似于 Semaphore . 见 pull request #1032 罗恩罗斯曼。

  • 延迟调整stdlib的活动线程列表,直到 threading 是猴子的补丁。以前这是在 gevent.threading 已导入。该模块被记录为用作猴修补的助手,因此它的功能通常是相同的,但有些应用程序忽略了该文档,并直接导入该模块。

    一个积极的结果是 import gevent.threading, threading; threading.current_thread() 在猴子修补之前将不再返回一个假人。另一个积极的结果是Pypy将不再打印 KeyError 退出时,如果 gevent.threading 已导入 没有 猴子修补。

    issue #984 .

  • 指定在某些工具中改进安装支持所需的python元数据(需要安装工具v24.2.1或更高版本)。见 issue #995 .

  • 猴子修补后 ssl 模块已经导入,现在打印一条警告,因为这会产生 RecursionError .

  • gevent.local.local 对象现在在pypy上获取、设置和删除属性的速度大约快3.5倍。这涉及到直接实现更多的属性协议。如果有任何兼容性问题,请打开一个问题。见 issue #1020 .

  • gevent.local.local 是用Cython在cpython上编译的。由于这项工作,速度已经快了5到6倍。 issue #1020 用赛通编译,速度提高了5到6倍,总速度提高了35倍左右。它现在和本地人在同一个棒球场 threading.local 类。它还使用每个对象一个指针更少的内存,每个greenlet一个指针更少的内存。见 pull request #1024 .

  • 更安全地终止Windows上的子进程 gevent.subprocess.Popen.terminate() . 报告时间: issue #1023 作者:Giacomo Debidda。

  • gevent现在使用cffi的“extern'python”回调。这些应该更快更稳定。这至少需要CFFI 1.4.0。见 issue #1049 .

  • 现在,gevent在运行回调时,大概会尝试遵循一个调度间隔,而不是简单地运行回调计数。间隔由 gevent.getswitchinterval() . 在Python3上,这与线程切换间隔相同。在python 2上,这个值默认为0.005s,可以用 gevent.setswitchinterval() . 这将导致更公平地“安排”小菜,尤其是当 gevent.sleep(0) 或者正在使用其他繁忙的回调。每隔50次回调检查一次间隔,以降低开销。见 issue #1072 . 感谢阿卡迪·伊万诺夫和安东尼奥·库尼。

小精灵#

  • 添加首字母 实验的 支持将libuv用作后端而不是libev,通过设置环境变量进行控制 GEVENT_CORE_CFFI_ONLY=libuv 在导入gevent之前。与libev相比,这受到了一些限制,尤其是:

    • 上传到pypi的manylinux轮子不支持libuv。manylinux规范要求glibc 2.5,而libuv要求glibc2.12。从源代码安装以访问Linux上的libuv(例如,pip --no-binary 选择权。

    • 计时器(例如 gevent.sleepgevent.Timeout )只支持1毫秒的分辨率(实际上接近1.5毫秒)。尝试使用较小的物体会自动将其增加到1毫秒并发出警告。因为libuv只支持毫秒分辨率,将更高精度的时钟舍入到整数毫秒,所以计时器显然会受到更大的抖动。

    • 使用负超时的行为可能与libev不同。

    • libuv阻止了所有信号的传输,因此使用(任意)0.3秒计时器处理信号。这意味着信号处理将被延迟到该数量,并且事件循环可以在操作系统的 poll 打电话就是这个数目。注意,这也是Gevent在Windows上为libev所做的。

    • libuv每个文件描述符只支持一个IO观察程序,而libev和gevent始终支持使用不同设置的许多观察程序。libev行为在python级别被模拟,但这增加了开销。

    • 在不读取或写入任何数据的情况下(与libev一起使用),循环多次并期望每次引发相同文件描述符的事件在使用Linux时似乎无法正常工作 gevent.select.poll 或者一只猴子 selectors.PollSelector .

    • 构建系统不支持使用系统libuv;必须使用嵌入副本。使用SETUPTOOLS编译libuv是发现的最可移植的方法。

    • 如果有什么意外的事情发生,Libuv喜欢 abort() 整个过程而不是报告错误。例如,关闭监视程序中使用的文件描述符可能会导致整个进程退出。

    • 偶尔会发生其他原因不明且难以复制的车祸。如果你能复制一次车祸, 拜托 提交问题。

    • 这是pypy在Windows上唯一可以使用的后端。对于这个alpha,有许多已知的非阻塞套接字问题(例如 asyncoretest_ftplib.py )有时插座没有及时闭合(显然;见 test_httpservers.py )与子流程通信(它总是挂起)。如果能帮助追踪这些信息,我们将不胜感激。只测试PYPY2。

    欢迎反馈和请求,特别是解决上述问题。

    其他差异包括:

    • 调用计时器和其他回调的顺序可能不同于libev。特别是,计时器和IO回调以不同的顺序发生,并且计时器可能很容易关闭到假定的1毫秒分辨率的一半。见 issue #1057 .

    • 启动 timer 默认情况下,观察程序不更新循环的时间。这是因为,与libev不同,如果其他计时器回调因循环的时间更新而过期,则计时器回调可能会导致运行其他计时器回调,而不会循环事件循环。见 issue #1057 .

      Libev也被改变了以遵循这种行为。

      也看到 issue #1072 .

    • 持续时间为零的计时器不一定会导致事件循环,就像在libev中一样。相反,他们可能会被立即呼叫。如果从其他零持续时间计时器回调中添加零持续时间计时器,这可能导致循环看起来挂起,因为实际上不会执行IO。

      为了缓解这个问题, loop.timer() 检测使用零持续时间计时器的尝试,并将其转换为检查观察程序。检查观察者不支持 again 方法。

    • 所有观察者(例如, loop.ioTimeout 班级有一个 close 当使用对象完成代码时应调用的方法(它们还充当上下文管理器和 with 语句将自动关闭它们)。GEvent在内部为套接字、文件对象和内部超时执行此操作。忽略关闭对象可能导致本机资源泄漏。要调试它,请设置环境变量 GEVENT_DEBUG=debugPYTHONTRACEMALLOC=n 在开始处理之前。

      传统的基于cython的libev后端不会泄露,如果 close 不会调用,也不会生成警告。基于cffi的libev后端目前不会泄漏,但会产生警告。基于cffi的libuv后端可能会泄漏并发出警告。

    同样,这是非常实验性的,而且所有的都会发生变化。

    issue #790 为历史和更深入的讨论。

小精灵#

  • C扩展被更新为使用更现代的cython习惯用法,并生成更少的代码以简化、更快的编译和更好的缓存使用。见 pull request #1077 .

    • 观察者对象可能稍大一些。在64位平台上,典型的观察程序可能会大16字节(2个指针)。这被轻微的性能提升所抵消。

    • 赛通不再预处理。以前只在某些编译模式(特别是libev-embed)中定义的某些属性现在总是被定义的,但会引发 AttributeError 或在不可用时具有负值。通常,这些属性不可移植或记录,也不由libuv或cffi后端实现。见 issue #1076 .

    • 某些专用帮助程序功能 (gevent_handle_error 和的一部分 gevent_call )现在是在cython而不是c中实现的。这减少了我们对cython和python内部未记录的实现细节的依赖,这些细节可能会发生变化。见 pull request #1080 .