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_INET
或AF_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)#
允许弱引用
gevent.queue.Queue
. 报告时间: issue #1217 作者:Githrdw。
1.3.1(2018年5月18日)#
允许弱引用
gevent.event.Event
. 报告时间: issue #1211 马蒂亚斯·吉亚罗。修复的嵌入使用
gevent.Greenlet.spawn()
尤其是在Uwsgi的领导下。报告时间: issue #1212 作者:Kunal Gangakhedkar。固定
gevent.os.nb_write()
和gevent.os.nb_read()
不总是关闭在发生异常时打开的IO事件。这将是一个问题,尤其是对libuv而言。
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 .未记录的内部实现类
IMap
和IMapUnordered
现在使用cython编译类,进一步减少了[Thread]Pool.imap
.班级
gevent.event.Event
和gevent.event.AsyncResult
与赛通一起编译以提高性能,正如gevent.queue
模块和gevent.hub.Waiter
以及轮毂本身的某些时间敏感部分。请报告任何兼容性问题。python -m gevent.monkey <script>
接受更多值<script>
包括到包或编译字节码的路径。报告时间: issue #1157 埃迪·林德。为分离通信添加一个简单的事件框架。它使用
zope.event
如果安装了。gevent.monkey
支持事件订阅服务器和安装工具入口点形式的插件。见 pull request #1158 和 issue #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)修复建筑。
增强功能#
添加
dnspython
解析器作为C-ARES的轻量替代品。它通常比C-ARES快,并支持Pypy。C-ARES在未来可能会被弃用。见 pull request #1088 和 issue #1103 .添加模块
gevent.time
可以导入而不是time
,很像gevent.socket
可以导入而不是socket
. 它包含gevent.sleep
. 这有助于猴子修补。的简单子类
gevent.local.local
现在有了相同的(实质上改进的)性能特征平原gevent.local.local
本身,使它们比以前快2到3倍。见 pull request #1117 . 如果存在任何兼容性问题,请打开问题。
监视和调试#
greenlet对象现在跟踪它们的生成父greenlet和生成它们的代码位置,除了维护“本地生成树”映射之外。这增加了一些相对的运行时开销,但绝对数仍然相对较小。基于贝宝的建议和Mahmoud Hashemi和Kurt Rose的评论。见 issue #755 和 pull request #1115 . 一如既往,我们感谢您的反馈。
Greenlet对象现在有一个
minimal_ident
属性。它的功能与Thread.ident
或id
通过在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_fds
和start_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-cext
,libev-cffi
或libuv-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 #1115 和 pull request #1120 .在cpython上,允许
gevent.Greenlet
,gevent.local
和gevent.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头文件的冲突。
漏洞修补#
如果一个绿叶树创造并摧毁了许多
gevent.local.local
对象如果不退出,则在greenlet退出后,将出现用于清理局部变量的函数对象泄漏。引入弱引用以避免这种情况。报告时间: issue #981 作者:Heungsub Lee。默认情况下,pywsgi还捕获和忽略
errno.WSAECONNABORTED
在窗户上。初始修补程序 pull request #999 简·范瓦尔堡。gevent.subprocess.Popen.communicate()
在python 3下的通用换行模式下,或者在指定了编码时,返回正确的str类型(不是bytes)。初始修补程序 pull request #939 作者:威廉·格里博夫斯基。gevent.subprocess.Popen.communicate()
(一般来说,访问Popen.stdout
和Popen.stderr
)返回在python 2下的通用换行模式下的正确str(bytes)类型。以前它总是返回Unicode字符串。报告时间: issue #1039 作者:Michal Petrucha。gevent.fileobject.FileObjectPosix
在python 2上以通用换行模式返回本机字符串。这与FileObjectThread
做。见 issue #1039 .socket.send()
现在渔获量EPROTOTYPE
在MacOS上处理关闭期间的竞争情况。固定在 pull request #1035 杰伊·奥斯特。gevent.socket.create_connection()
如果连接或绑定引发BaseException
喜欢KeyboardInterrupt
,greenlet.GreenletExit
或gevent.timeout.Timeout
. 报告时间: issue #1044 作者:Kochemonster。
其他变化#
Pool.add
现在接受blocking
和timeout
参数,其功能类似于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.sleep
和gevent.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,有许多已知的非阻塞套接字问题(例如
asyncore
见test_ftplib.py
)有时插座没有及时闭合(显然;见test_httpservers.py
)与子流程通信(它总是挂起)。如果能帮助追踪这些信息,我们将不胜感激。只测试PYPY2。
欢迎反馈和请求,特别是解决上述问题。
其他差异包括:
调用计时器和其他回调的顺序可能不同于libev。特别是,计时器和IO回调以不同的顺序发生,并且计时器可能很容易关闭到假定的1毫秒分辨率的一半。见 issue #1057 .
启动
timer
默认情况下,观察程序不更新循环的时间。这是因为,与libev不同,如果其他计时器回调因循环的时间更新而过期,则计时器回调可能会导致运行其他计时器回调,而不会循环事件循环。见 issue #1057 .Libev也被改变了以遵循这种行为。
也看到 issue #1072 .
持续时间为零的计时器不一定会导致事件循环,就像在libev中一样。相反,他们可能会被立即呼叫。如果从其他零持续时间计时器回调中添加零持续时间计时器,这可能导致循环看起来挂起,因为实际上不会执行IO。
为了缓解这个问题,
loop.timer()
检测使用零持续时间计时器的尝试,并将其转换为检查观察程序。检查观察者不支持again
方法。所有观察者(例如,
loop.io
)Timeout
班级有一个close
当使用对象完成代码时应调用的方法(它们还充当上下文管理器和with
语句将自动关闭它们)。GEvent在内部为套接字、文件对象和内部超时执行此操作。忽略关闭对象可能导致本机资源泄漏。要调试它,请设置环境变量GEVENT_DEBUG=debug
和PYTHONTRACEMALLOC=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 .