将嵌入式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 。
将嵌入式libev从4.31更新为4.33。看见 issue #1754 。
将嵌入式libuv从1.38.0更新到1.40.0。看见 issue #1755 。
看见 issue #1753 。
修复一个 TypeError
在Python 2上启动时,使用 zope.schema
已安装。乔什·祖伊克报道。
创建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 。
制作 gevent.Greenlet
对象充当上下文管理器。当 with
套间结束,直到小绿灯完成,执行才会继续。这可以是一种更简单的替代方法,而不是 gevent.pool.Group
何时可以按词汇范围限定小绿程序的生命周期。
安德烈·卡隆建议。看见 issue #1324 。
制作gevent的 Semaphore
对象正确处理比C#中可以存储的大小更大的本机线程标识符 long
在Python3上,不是引发 OverflowError
。
由TheYOSH报道。看见 issue #1733 。
创建由以下人员创建的工作线程 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 。
嵌入式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 .
现在可以在Cygwin平台上构建和使用嵌入式libuv。
请注意,Cygwin并不是上游libuv的官方支持平台,而且gevent也没有对其进行测试,因此实际的工作状态是未知的,这可能会在未来的版本中出错。
多亏了伯卡金奇的贴片。看见 issue #1645 。
在PyPy上放宽psutil的版本约束。
以前,PyPy2将其固定为5.6.3,但在Windows上除外,因为在Windows上排除了它。现在,它再次被视为与CPython相同。看见 issue #1643 。
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 .
添加 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 .
派生一个使用线程池来运行创建自己集线器的任务的进程将无法通过引发来清理线程池 greenlet.error
. 见 issue #1631 .
事件和信号量对象上调用 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 .
将捆绑的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 .
让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 .
有关旧版本的完整信息,请参见 有关旧版本的信息 。
Next page: Changelog