1.5版的更改#
1.5.0(2020-04-10)#
制作
gevent.lock.RLock.acquire
接受 超时 参数。修复一个
AttributeError
包装gevent的时候FileObject
围绕打开的文本流。报告时间 issue #1542 由德姆劳森。修复AIX和solaris10上libuv的编译。看到了吗 pull request #1549 和 pull request #1548 作者:Arnon Yaari。
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版本。唯一的改变是添加更多属性到Frame
和Code
对象以实现pytest兼容性。看到了吗 pull request #1541 .
潜在的突破性变化#
Remove the magic proxy object
gevent.signal
. This served as both a deprecated alias ofgevent.signal_handler
and the modulegevent.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.Lock
和threading.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'模式一致,所以大多数应用程序不应该受到影响。
文件对象 (
FileObjectPosix
,FileObjectThread
)现在一直支持文本和二进制模式。如果模式中没有给出“b”或“t”,则它们将读写本机字符串。如果给定't',它们将始终使用unicode字符串,而'b'将始终使用字节字符串。 (FileObjectPosix
已经这样工作了。)看到了吗 issue #1441 .文件对象接受 编码 , 错误 和 换行符 论据。在Python2上,只有在“t”处于模式时才使用它们。
的默认模式
FileObjectPosix
从改变rb
简单地说r
,以便与其他文件对象和标准保持一致open
和io.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 clean
和make distclean
,现在可以用跨平台的方式python setup.py clean
和python setup.py clean -a
,分别。剩下的Makefile
包含已移动到的travis ci命令.travis.yml
.贬低
EMBED
和LIBEV_EMBED
等等,构建时间环境变量。相反,使用GEVENTSETUP_EMBED
和GEVENTSETUP_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 .子过程:
WIFSTOPPED
和SIGCHLD
现在处理以确定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 .