Changelog#
24.2.1(2024-02-14)#
错误修正#
添加了对3.11.8和3.12.2版的Python补丁的支持,这两个版本更改了线程的内部细节。
由于这些更改,请注意,不再可能更改
__class__
一种gevent.threading._DummyThread
对象在这些版本上。看见 issue #2020 。
其他#
与标准库兼容的其他更新包括:
引发的错误来自
subprocess.Popen
可能没有设置文件名。
SSLSocket.recv_into
和SSLSocket.read
不再需要缓冲区来实现len
现在使用大小不是1的缓冲区。GH-108310:修复CVE-2023-40217:检查并避免SSL预关闭缺陷。
此外,还有:
丢弃
setuptools
到软测试依赖项。放弃对非常旧版本的CFFI的支持。
将捆绑的C-ARES从1.19.1更新到1.26.0。
由GEvent创建但从多个不同线程获取的锁(不推荐)不再旋转以实现超时和可中断阻塞。取而代之的是,它们使用的是Python3锁的本地功能。这可能会改善一些情况。看见 issue #2013 。
23.9.1(2023-09-12)#
错误修正#
在Python3.11和Python3.12上需要使用greenlet 3.0;建议所有平台都使用greenlet 3.0。这修复了所有版本的Python上的一些鲜为人知的崩溃,并修复了一个在Python3.11+上相当常见的问题,该问题可能会表现为崩溃或
SystemError
。看见 issue #1985 。
23.9.0.post1(2023-09-02)#
修复Windows控制盘版本。
修复MacOS轮子版本。
23.9.0(2023-09-01)#
错误修正#
制作
gevent.select.select
接受任意的迭代量,而不仅仅是序列。也就是说,您现在可以传入文件描述符的生成器,而不是已实现的列表。在内部,任意可迭代对象被复制到列表中。这更好地匹配了标准库的功能。多亏了大卫·萨尔维斯伯格。看见 issue #1979 。在Python3.11和更高版本上,选择不使用Cython3.11的快速异常处理 may 在某些情况下,当与绿色纸币结合时会造成问题。
在所有版本的Python上,调整默认的基于C的循环中的一些错误处理。这修复了CPython调试版本上的几个断言故障。希望它能在现实条件下产生积极影响。看见 issue #1985 。
制作
gevent.pywsgi
更严格地遵守分块传输编码的HTTP规范。特别是,我们对预告片的要求要严格得多,无效的预告片(太长或带有不允许的字符)会强制关闭与客户端的连接 after 结果已经寄出了。否则,尾部将继续被忽略,并且对WSGI应用程序不可用。
以前,在保活连接上的分块请求中精心设计的无效尾部可能会显示为两个请求
gevent.pywsgi
。由于这与具有两个请求的普通保活连接完全相同,因此WSGI应用程序应该正常处理它。但是,如果您指望某个上游服务器根据路径或头字段过滤传入的请求,而上游服务器只是传递尾部而不对其进行验证,那么嵌入的第二个请求将绕过这些检查。(如果上游服务器验证尾部符合HTTP规范,则不会发生这种情况,因为尾部中不允许包含HTTP请求中所需的字符,如空格。)CVE-2023-41419是为此而保留的。我们感谢清华大学和中关村实验室的原始记者穆可然(mkr22@mails.tsinghua.edu.cn)和陈建军(jianjun@tsinghua.edu.cn)。看见 issue #1989 。
23.7.0(2023-07-11)#
特征#
使用greenlet 3.0a1添加对Python3.12的初步支持。目前从源代码构建这个代码有些棘手,而且有一个已知的问题:在Python3.12b3上,不可用greenlet的转储回溯。 issue #1969 。
将捆绑的C-ARES版本更新为1.19.1。看见 issue #1947 。
错误修正#
固定连接非阻塞设备的边框
SSLSocket
这可能会导致AttributeError。在与标准库匹配的更改中,调用sock.connect_ex()
关于…的子类socket
不再调用子类的connect
方法。普里扬卡尔·贾恩的初步定位。看见 issue #1932 。
制作GEvent的
FileObjectThread
(主要用于Windows)实施readinto
通力合作。公关作者:Kirill Smelkov。看见 issue #1948 。解决以下问题
AttributeError
在循环垃圾回收过程中,当使用 (__del__
等等)尝试使用GEvent API。这不是推荐的做法,目前还不清楚是否会发现这一点AttributeError
会解决任何问题,或者干脆转移它们。(如果我们能确定导致这一循环的根本情况,我们或许就能解决它。)看见 issue #1961 。
折旧和清除#
删除对过时的Python版本的支持。这是3.8之前的所有内容。
相关变化包括:
停止使用
pkg_resources
找到入口点(插件)。相反,您可以使用importlib.metadata
。荣誉
sys.unraisablehook
当回调函数产生异常时,在集线器中处理该异常 also 会产生一个异常。在旧版本中,这些只需打印即可。setup.py
不再包括setup_requires
关键字。使用能够理解的工具进行安装pyproject.toml
是推荐的。捆绑的tblib已更新到2.0版。
22.10.2(2022-10-31)#
错误修正#
更新到Greenlet 2.0。这修复了需要更改greenlet的ABI的释放问题。Greenlet 2.0的设计目的是防止将来的修复和增强需要ABI更改,从而更容易独立更新gEvent和greenlet。
小心
Greenlet 2.0需要现代风格的C++编译器。这可能意味着某些较旧的平台不再受支持。看见 issue #1909 。
22.10.1(2022-10-14)#
特征#
将捆绑的libuv更新到1.44.2。看见 issue #1913 。
误码率#
看见 issue #1898 .,请参阅 issue #1910 .,请参阅 issue #1915 。
22.08.0(2022-10-08)#
特征#
Windows:测试并提供适用于PyPy3.7的二进制轮子。
请注意,子进程、信号可能会出现问题,并且速度可能会很慢。看见 issue #1798 。
将嵌入式C-ARES升级到1.18.1。看见 issue #1847 。
将捆绑的libuv从1.40.0升级到1.42.0。看见 issue #1851 。
添加了对Python3.11(RC2及更高版本)的初步支持。
目前,一些平台可能有双轮,也可能没有。
重要
对包括2.7和3.6在内的遗留版本的支持即将结束。维护负担变得太重,维护人员的时间太有限。
理想情况下,将会有一个与Greenlet 2.0的最终版本兼容的GEvent版本,该版本仍然支持那些遗留版本,但这可能是不可能的;这可能是支持它们的最终版本。
gevent.threadpool.ThreadPool
现在可以选择使空闲线程过期。默认情况下,这在用于DNS请求和其他用户提交的任务的隐式线程池中使用;线程池的其他用途需要选择加入。看见 issue #1867 。
错误修正#
真正禁用使用编译
-ffast-math
。看见 issue #1864 。
21.12.0(2021-12-11)#
特征#
更新Apple Silicon Mac的Autoconf文件。请注意,虽然现在有报道称在Apple Silicon Mac上编译GEvent,但这是 not 经过测试的配置。在某些系统上,CFFI可能还存在一些遗留问题。看见 issue #1721 。
构建并上传CPython3.10二进制MANYLINUX轮。
不幸的是,这需要我们停止构建和上传CPython2.7的二进制MANYLINUX轮子。Windows和MacOS仍可使用2.7版的二进制车轮。看见 issue #1822 。
测试并分配Musllinux_1_1车轮。看见 issue #1837 。
更新已测试的PyPy2和PyPy3版本。对于PyPy2,不应该有用户可见的更改,但对于Py3,支持已经从Python3.6转移到了Python3.7。看见 issue #1843 。
错误修正#
尽量避免链接到Windows上的两个不同的Python运行时DLL。看见 issue #1814 。
停止编译许多linux轮子
-ffast-math.
这是隐含在-Ofast
,但可能会改变这一过程的全球状态。多亏了伊利亚·康斯坦丁诺夫的分析和修复。看见 issue #1820 。修复了在Python3.9.8和更高版本中,如果GEvent猴子修补发生在非主线程上,解释器在关闭时挂起的问题。(请注意,这不是建议的做法。)看见 issue #1839 。
21.8.0(2021-08-05)#
特征#
将嵌入式C-ARES从1.16.1更新到1.17.1。看见 issue #1758 。
添加对Python 3.10rc1及更高版本的支持。
作为其中的一部分,所需的最低greenlet版本提高到了1.1.0(在CPython上),从源代码签出构建gevent所需的Cython最低版本是3.0a9。
请注意,dnspython解析器在Python 3.10上不可用。看见 issue #1790 。
从Cython 3.0a6更新到3.0a9。看见 issue #1801 。
误码率#
看见 issue #1789 。
21.1.2(2021-01-20)#
特征#
将嵌入式libev从4.31更新为4.33。看见 issue #1754 。
将嵌入式libuv从1.38.0更新到1.40.0。看见 issue #1755 。
误码率#
看见 issue #1753 。
21.1.1(2021-01-18)#
错误修正#
修复一个 TypeError
在Python 2上启动时,使用 zope.schema
已安装。乔什·祖伊克报道。
21.1.0(2021-01-15)#
错误修正#
创建Gevent
FileObjects
对象的本机文件对象的语义更加匹配name
属性:从文件描述符整数打开的对象将该整数作为其
name.
(请注意,这是Python 3语义;从返回的Python 2原生文件对象os.fdopen()
将字符串“<fdopen>”作为它们的名称,但这里的gevent始终跟在Python3之后。)这个
name
关闭文件对象后保持可访问状态。
多亏了丹·米隆。看见 issue #1745 。
误码率#
制作 gevent.event.AsyncResult
当检测到不正确的跨线程使用而不是挂起时,打印警告。
AsyncResult
有 绝不可能 可以安全地从多个线程使用。与大多数gevent对象一样,它旨在处理来自单个线程的greenlet。使用 AsyncResult
具有未定义的语义。线程间通信的最安全方式是使用事件循环异步观察器。
那些未定义的语义在最近的gevent版本中发生了变化,使得滥用的 AsyncResult
会以可能导致程序挂起的方式行为不端。
现在,当 AsyncResult
检测到可能挂起的情况时,它会向stderr打印警告。请注意,这是尽力而为,挂起仍然是可能的,特别是在PyPy 7.3.3下。
同时, AsyncResult
被调优为更像在旧版本中的行为,这意味着挂起的可能性再次大大降低。如果你走运的话 AsyncResult
成功地跨线程,这可能会恢复您的运气。此外,跨线程唤醒速度更快。请注意,Gevent集线器现在使用额外的文件描述符来实现这一点。
类似的更改也适用于 gevent.event.Event
(请参阅 issue #1735 )。
看见 issue #1739 。
20.12.1(2020-12-27)#
特征#
制作
gevent.Greenlet
对象充当上下文管理器。当with
套间结束,直到小绿灯完成,执行才会继续。这可以是一种更简单的替代方法,而不是gevent.pool.Group
何时可以按词汇范围限定小绿程序的生命周期。安德烈·卡隆建议。看见 issue #1324 。
错误修正#
制作gevent的
Semaphore
对象正确处理比C#中可以存储的大小更大的本机线程标识符long
在Python3上,不是引发OverflowError
。由TheYOSH报道。看见 issue #1733 。
20.12.0(2020-12-22)#
特征#
创建由以下人员创建的工作线程
gevent.threadpool.ThreadPool
安装threading.setprofile()
和threading.settrace()
任务运行时的钩子。这为分析和跟踪工具(如yappi)提供了可见性。苏海尔·穆罕默德报道。看见 issue #1678 。
放弃对Python3.5的支持。
错误修正#
错误地传递异常 实例 而不是异常 type 至
gevent.Greenlet.kill
或gevent.killall
不再将异常打印到stderr。看见 issue #1663 。当有未完成的回调或IO操作调度时,使销毁集线器更努力地更强制地停止循环处理。
多亏了乔什·斯奈德 (issue #1686 )和Jan-Philip Gehrcke (issue #1669 )。看见 issue #1686 。
提高使用猴子补丁锁的能力,以及
gevent.lock.BoundedSemaphore
,跨线程,特别是当各种线程可能没有Gevent集线器或任何其他活动的小程序时。特别是,它处理以前引发的一些案例。LoopExit
否则就会被绞死。请注意,这在Windows上的PyPy上可能不可靠;当前不推荐这样的环境。如果看起来没有必要,信号量会尽量避免创建集线器,在单线程的情况下会自动创建一个集线器,而在多线程的情况下则不会。虽然这些差异应该被正确地检测出来,但也有可能在某些情况下它们并没有被正确地检测出来。
如果您的应用程序似乎挂起了获取信号量,但将调用添加到
gevent.get_hub()
在修复之前尝试获取信号量的线程中,请提交问题。看见 issue #1698 。当一个greenlet遇到一个错误时进行错误报告
RecursionError
更可靠。丹·米隆报道。看见 issue #1704 。
pywsgi:避免在某些无效的客户端请求上将额外的回溯(“TypeError:格式字符串没有足够的参数”)打印到标准错误。
史蒂文·格林报道。看见 issue #1708 。
添加对PyPy2 7.3.3的支持。看见 issue #1709 。
Python 2:制作
gevent.subprocess.Popen.stdin
对象有一个write
方法,该方法保证以二进制、无缓冲模式写入整个参数。这可能需要多次绕过事件循环,但更符合Python2标准库(以及1.5之前的gevent)的行为。仍返回写入的字节数(而不是None
)。看见 issue #1711 。制作
gevent.pywsgi
停止尝试强制执行读取分块输入的规则,或者Content-Length
在将连接升级(例如升级到WebSocket连接)时终止输入。同样,如果通过返回101
状态,则停止尝试自动分块响应。Kavindu Santhusa报道。看见 issue #1712 。
移除
__dict__
属性来自gevent.socket.socket
objects. The standard library socket do not have a_ _dict__
.叶卡森(Carson Ip)注意到。
作为此重构的一部分,请在Python 2和Python 3之间共享更多通用套接字代码。请参阅 issue #1724 。
20.9.0(2020-09-22)#
特征#
嵌入式libev现在被要求检测
clock_gettime
如果有的话,使用实时和/或单调时钟。在Linux上,这可以减少libev进行的系统调用数量。最初由乔什·斯奈德提供。看见 issue #1648 。
错误修正#
在CPython上,依赖于greenlet>=0.4.17。此版本与cpython3.7及更高版本的早期版本不兼容。
在Python 3.7及更高版本中,模块
gevent.contextvars
不再简单地添加到标准库中。contextvar现在既是greenlet,也是异步任务本地。看见 issue #1656 。看见 issue #1674 。这个
DummyThread
当标准库线程模块被monkey修补时,由某些操作自动创建的对象现在与标准库使用的命名约定匹配(“Dummy-12345”)。以前(从gevent 1.2a2开始)他们使用“DummyThread-12345”。看到了吗 issue #1659 .修复与dnspython 2的兼容性。
小心
这意味着它可以被导入。但现在还不能使用。目前,gevent对dnspython<2有一个固定的依赖关系。
见 issue #1661 .
20.6.2(2020-06-16)#
特征#
现在可以在Cygwin平台上构建和使用嵌入式libuv。
请注意,Cygwin并不是上游libuv的官方支持平台,而且gevent也没有对其进行测试,因此实际的工作状态是未知的,这可能会在未来的版本中出错。
多亏了伯卡金奇的贴片。看见 issue #1645 。
错误修正#
在PyPy上放宽psutil的版本约束。
以前,PyPy2将其固定为5.6.3,但在Windows上除外,因为在Windows上排除了它。现在,它再次被视为与CPython相同。看见 issue #1643 。
20.6.1(2020-06-10)#
特征#
gevent的CI现在在ubuntu18.04(Bionic)上测试,这是从16.04(Xenial)升级而来的。看到了吗 issue #1623 .
错误修正#
在Python2上,无需安装选择器2即可使用dnspython解析器。以前,会引发ImportError。看见 issue #1641 。
Python 3
gevent.ssl.SSLSocket
物体不再试图捕捉ConnectionResetError
把它当作SSLError
具有SSL_ERROR_EOF
(通常是通过抑制它)。这与标准库的行为方式(即引发异常)不同。它是在openssl1.1和tls1.3的早期测试中添加到gevent中的。看到了吗 issue #1637 .
20.6.0(2020-06-06)#
特征#
添加
gevent.selectors
包含GeventSelector
. 这个选择器实现使用gevent details来尝试减少轮询多个文件描述符时的开销,这些描述符中只有一些在给定的时间准备就绪。这是猴子补丁
selectors.DefaultSelector
默认情况下。如果
selectors2
后端口已安装。(此后端口是使用recommended
额外)猴子修补时,selectors
作为此模块的别名提供。看到了吗 issue #1532 .取决于greenlet>=0.4.16。这是CPython 3.9和3.10a0所必需的。看到了吗 issue #1627 .
添加对Python3.9的支持。
然而,目前还没有二元轮子可用。看到了吗 issue #1628 .
错误修正#
gevent.socket.create_connection
和gevent.socket.socket.connect
不再忽略IPv6作用域ID。任何IP地址(IPv4或IPv6)都不再受制于对的额外调用
getaddrinfo
. 根据使用的解析器,这可能会改变greenlet开关的数量和顺序。(在Windows上,特别是在没有其他greenlet运行的测试用例中,观察到LoopExit
在以前没有出现过的场景中)看到了吗 issue #1634 .
20.5.2(2020-05-28)#
错误修正#
派生一个使用线程池来运行创建自己集线器的任务的进程将无法通过引发来清理线程池
greenlet.error
. 见 issue #1631 .
20.5.1(2020-05-26)#
特征#
事件和信号量对象上调用
wait()
或acquire()
分别地,找到已经设置的事件或可用的信号量,不再“切入线”并在任何先前计划的greenlet之前运行。它们现在按照到达的顺序运行,就像服务生必须阻止这些方法一样。看到了吗 issue #1520 .在Linux上将测试过的PyPy版本从7.3.0更新到7.3.1。看到了吗 issue #1569 .
制作
zope.interface
,zope.event
和(扩展)setuptools
必需的依赖项。这个events
安装额外现在什么也不做,将在2021年被删除。看到了吗 issue #1619 .将bundled libuv从1.36.0更新到1.38.0。看到了吗 issue #1621 .
将捆绑的c-ares从1.16.0更新到1.16.1。
在macOS上,不要再试图调整c-ares头文件来使它们通用。看到了吗 issue #1624 .
错误修正#
makegevent锁是猴子补丁的,通常可以跨本机线程工作,也可以在单个线程中跨greenlet工作。只在单个线程中使用的锁不会影响性能。虽然跨线程锁定相对昂贵,而且不是推荐的编程模式,但它可能会在不知不觉中发生,例如在使用线程池和
logging
.以前,跨线程锁的使用可能会成功,或者,如果锁被争用,则会引发
greenlet.error
. 现在,在争用的情况下,如果主线程至少获得了一次锁,那么它应该在任何线程中正确地阻塞,并与两个线程的事件循环协作。在某些情况下(希望很少见),可能会引起争讼案件LoopExit
以前它会升高的greenlet.error
;如果这些案例是实际问题,请打开问题。此外,当设置PURE_Python时,底层信号量始终以原子方式运行(就像没有释放GIL一样)。以前,它只在PyPy上正确地这样做。看见 issue #1437 。
使用前缀重命名gevent的C加速器扩展模块,以避免与其他C扩展冲突。看到了吗 issue #1480 .
使用
gevent.wait
关于一个Event
当该事件已设置时,以前可能多次引发AssertionError。作为其中的一部分,在主greenlet中引发的异常现在将包括对失败的greenlet的更完整的回溯。看到了吗 issue #1540 .
避免关闭同一个Python libuv watcher IO对象两次。在某些情况下(只在Windows上看到),这可能导致程序崩溃。看到了吗 issue #1587 .
gevent现在可以使用cython3.0a5和更新版本来构建。PyPI发行版使用这个版本。
libev扩展与此不兼容。作为这项工作的一部分,某些内部的、没有文件记录的名字已经被改变了。
(从技术上讲,gevent可以用Cython 3.0a2及更高版本构建。但是,使用cython3编译3.0a4会导致gevent的内存泄漏测试失败。看到了吗 this Cython issue )参见 issue #1599 .
在加入一个集线器后销毁它并不一定会清除与该集线器相关的所有资源,特别是如果集线器是在正在退出的辅助线程中创建的。这个中心和它的母代绿叶可以继续存活。
现在,销毁集线器会删除对集线器的引用,并确保它不能再次切换到。(尽管使用新的阻塞API调用仍可能创建新的集线器。)
加入一个集线器还可以清理一些(小的)内存资源,这些资源以前可能会停留更长时间。看到了吗 issue #1601 .
修复使用libuv时可能发生的一些崩溃
gevent.signal_handler
. 运行测试套件时看到的崩溃是不确定的。看到了吗 issue #1606 .
20.5.0(2020-05-01)#
特征#
将捆绑的c-ares更新到1.16.0版本。 Changes . 见 issue #1588 .
更新所有捆绑的
config.guess
和config.sub
脚本。看到了吗 issue #1589 .将bundled libuv从1.34.0更新到1.36.0。看到了吗 issue #1597 .
错误修正#
使用
ares_getaddrinfo
而不是手动查找。这需要c-ares 1.16.0。
请注意,这可能会更改结果,特别是它们的顺序。
作为其中一部分,c-ares的某些扩展部分被改编成使用现代的cyton成语。
一些小错误和差异也得到了修复,例如
gethostbyaddr('localhost')
在Python3上工作,在Python2上失败。DNSpython解析器现在在更多情况下引发预期的TypeError,而不是AttributeError。看到了吗 issue #1012 .c-ares和DNSPython解析器现在提出的异常与标准解析器更加一致。类型和errno更可能匹配标准库生成的内容。
根据系统和配置的不同,结果可能不完全匹配,至少在DNSPython中是这样。仍然有一些罕见的情况下,系统解析器可以引发
herror
但是DNSPython会筹集gaierror
反之亦然。似乎没有一个确定的方法来解释这一点。在PyPy上,getnameinfo
当CPython提高时可以产生结果socket.error
,而gevent的DNSPython解析器也引发了socket.error
.此外,还处理了其他几个小的差异,包括本地主机名和广播主机名的处理。
备注
这已经在Linux(CentOS和Ubuntu)、macOS和Windows上进行了测试。它还没有在其他平台上测试过,所以结果对他们来说是未知的。尤其是c-ares支持使用一些附加的套接字函数和定义。请让维护人员知道这是否会带来问题。
见 issue #1459 .
20.04.0(2020-04-22)#
特征#
让CI(Travis和Appveyor)为Windows、macOS和manylinux构建并上传发布轮。作为其中的一部分,如果标准库的
test.support
模块已被剥离。看到了吗 issue #1555 .将经过测试的PyPy版本从Windows上的7.2.0更新到7.3.1。看到了吗 issue #1569 .
错误修正#
一个关于窗口上的虚假资源泄漏和修复的警告。圣潘·雷恩维尔报道。看到了吗 issue #1564 .
将猴补片适当拆除
select.epoll
和select.kqueue
. 基里尔·斯梅尔科夫报道。看到了吗 issue #1570 .使猴子补丁成为可能
contextvars
在Python3.7之前,如果安装了与标准库同名的非标准后台端口。以前这会引发一个错误。西蒙·戴维报道。看到了吗 issue #1572 .修复销毁libuv默认循环,然后再次使用默认循环。看到了吗 issue #1580 .
监视子对象的libuv循环现在可以退出。以前,SIGCHLD观察者即使不再有被监视的孩子,也会保持循环的活动。看到了吗 issue #1581 .
折旧和清除#
libpyev和libpyev分配函数不再用于libpy分配。看到了吗 issue #1569 .
误码率#
见 issue #1367 .
较早版本#
有关旧版本的完整信息,请参见 有关旧版本的信息 。
- 1.5版的更改
- 1.4版的更改
- 1.3版的更改
- 1.2版的更改
- 1.1版的更改
- 1.0版的更改
- Gevent 1.0之前的更改
- 0.13.8版(2012年9月6日)
- 0.13.7版(2012年4月12日)
- 0.13.6版(2011年5月2日)
- 0.13.5版(2011年4月21日)
- 0.13.4版(2011年4月11日)
- 0.13.3版(2011年2月7日)
- 0.13.2版(2011年1月28日)
- 0.13.1版(2010年9月23日)
- 0.13.0版(2010年7月14日)
- 0.12.2版(2010年3月2日)
- 0.12.1版(2010年2月26日)
- 0.12.0版(2010年2月5日)
- 0.11.2版(2009年12月10日)
- 0.11.1版(2009年11月15日)
- 0.11.0版(2009年10月9日)
- 0.10.0版(2009年8月26日)
- 0.9.3版(2009年8月3日)
- 0.9.2版(2009年7月20日)
- 0.9.1版(2009年7月9日)
- 0.9.0版(2009年7月8日)