1.2版的更改#
1.2.2(2017-06-05)#
由于SSL的变化,在python 3.5上的测试现在使用python3.5.3。见 issue #943 .
Linux CI从Ubuntu 12.04更新到Ubuntu 14.04,因为前者已经达到了EOL。
Linux CI现在在pypy2 5.7.1上进行测试,从pypy2 5.6.0更新。
LinuxCI现在在pypy3 3.5-5.7.1-beta上进行测试,从pypy3 3.3-5.5-alpha更新。
python 2套接字与
SOCK_CLOEXEC
在Linux上找到标记。它们不再将套接字类型或协议传递给getaddrinfo
什么时候?connect
被调用。报告时间: issue #944 伯尼·哈克特。替换
optparse
模块argparse
. 见 issue #947 .更新至1.3.1版
tblib
修理 issue #954 ,由ML31415报告。修复的名称
type
参数到gevent.socket.getaddrinfo()
在python 3上是正确的。这将导致调用方使用关键字参数引发TypeError
. 报告时间: issue #960 根据JS6626069。同样,更正参数名称fromfd
和socketpair
在python 2上,尽管不能用cpython下的关键字参数调用它们。备注
这个
gethost*
函数在cpython和pypy下使用不同的参数名。尽管不能用cpython上的关键字参数调用这些函数,但gevent遵循cpython约定。以前的singleton异常对象
FileObjectClosed
和cancel_wait_ex
已转换为类。在Python3上,异常对象是有状态的,包括对其上下文的引用和可能的回溯,这可能导致对象的生存期比预期的要长。确保
python -m gevent.monkey <script>
在全局范围内运行代码,而不是在main
功能。固定在 pull request #975 肖恩·波勒。
1.2.1(2017-01-12)#
CI服务现在在3.6.0上进行测试。
Windows:提供
socket.socketpair
对于所有的python 3版本。这是添加到Python3.5中的,但测试只添加到3.6中。(对于3.4之前的版本,这是一个gevent扩展。)以前,任何Python3版本都不支持这种扩展。Windows:列表
subprocess.STARTUPINFO
在里面subprocess.__all__
3.6兼容性。这个
_DummyThread
通过调用创建的对象threading.current_thread()
从生的里面greenlet.greenlet
在一个有猴子补丁的系统中threading
现在,当绿叶树死后,自己清理。 (gevent.Greenlet
基于_DummyThreads
总是打扫干净)。这需要使用weakref.ref
(可能在Pypy上不及时)。报告时间: issue #918 Frozenoctober。使用
-D_DARWIN_FEATURE_CLOCK_GETTIME=0
与10.12 Sierra之前的OS X版本兼容。内德·巴切尔德在 issue #916 .
1.2.0(2016年12月23日)#
与系统解析程序一样,C-ARES DNS解析程序忽略getnameinfo的错误标志。在清理DNS解析程序测试以生成更可靠的结果时发现。见 issue #774 .
1.2A2(2016年12月9日)#
将libev更新到4.23版。
允许
MAKE
环境变量,用于指定非Windows系统上的make命令,以便于在BSD系统上进行开发,其中make
BSD品牌和gmake
是GNU制造(GEvent需要GNU制造)。见 issue #888 .让
gevent.server.StreamServer
接受一个SSLContext
在支持它的Python版本上。添加到 pull request #904 阿卡迪·伊万诺夫。
1.2A1(2016年10月27日)#
不兼容的更改#
已删除对python 2.6的支持。见 pull request #766 .
删除模块
gevent.coros
替换为gevent.lock
自1.0b2以来一直被弃用。内部实现模块
gevent.corecext
和gevent.corecffi
已被移动。请从导入gevent.core
相反,这一直是唯一一个有文件证明的进口地。
库和安装#
将libev更新到4.22版(was 4.20)。
将tblib更新为1.3.0。
更新cython至0.25(之前为0.23.5)。
更新c-ares至1.12.0版(之前为1.10.0) (release notes )
为了下游包维护人员的利益,gevent现在使用C-ares和libev进行测试,动态链接,而不是嵌入(即使用系统库)。但是,只有与gevent一起提供的版本才经过测试,并且已知可以工作。
存储库目录布局已更改,以便更容易包含第三方依赖项。同样,setup.py脚本也被拆分,以便于构建第三方依赖项。
pypy/cffi:corecffi本机扩展现在只在安装时构建。以前,如果它不可用,则在每次导入时都尝试生成。这可能导致分散的“gevent”目录和不可依赖的结果。
安装工具现在在所有平台上的构建时都是必需的。以前只有Windows和Pypy需要它。
posix:不要硬编码
/bin/sh
进入配置命令行,而不是依赖sh
正在PATH
,根据建议 the standard . 固定在 pull request #809 弗雷德里克斯·福内尔。
安全性#
gevent.pywsgi
现在检查传递给start_response
不要包含回车或换行符以防止HTTP响应拆分(头注入),引发ValueError
如果有。见 issue #775 .包含下划线的传入头不再放置在wsgi环境中。见 issue #819 .
错误记录人
WSGIHandler
默认情况下不再打印整个WSGi环境。这样可以避免可能的信息披露漏洞。应用程序也可以选择更高的WSGi环境安全级别,如果他们选择并且他们的框架支持的话。最初报告于 pull request #779 由肖恩·彼得斯·奥改为 pull request #781 .
平台#
如上所述,不再支持Python2.6。
Python3.6现在在POSIX平台上进行了测试。其中包括一些显著的变化:
sslcontext.wrap_套接字接受
session
参数,尽管此参数在3.6之前不可用。sslsocket.recv(0)或read(0)返回空字节字符串。这是修复 Python bug #23804 它也被合并到了python 2.7和python 3.5中。
PYPY3 5.5.0型 阿尔法 (支持python 3.3.5)现在已经过测试并通过了测试套件。感谢btegs issue #866 和Fabio Utzig pull request #826 . 请注意,Pypy3并没有针对Pypy开发人员或Gevent下的性能进行优化,因此它可能比Pypy2慢得多。
stdlib兼容性#
模块
gevent.os
,gevent.signal
和gevent.select
从对应的标准库对应项中导出所有属性。Python 2:
reload(site)
不再失败TypeError
如果Gevent已经进口。报告时间: issue #805 杰克·希尔顿。Python 2:
sendall
在非阻塞的套接字上,可能会出现假故障并超时。
选择/投票#
如果
gevent.select.select()
是否定的 超时 参数,像标准库一样引发异常。如果
gevent.select.select()
如果在其任何列表中给定关闭或无效的文件描述符,请EBADF
像标准库那样的异常。以前,libev倾向于将描述符返回为就绪状态。在最坏的情况下,这会增加一个额外的系统调用,但是如果描述符在输入时已经准备好了,那么也会减少延迟。selectors.SelectSelector
不管进口订单如何,都要正确地修补。报告时间: issue #835 作者:Przemys_aw w_grzyn。gevent.select.poll.unregister()
在以下情况下引发异常 fd 没有注册,就像标准库一样。gevent.select.poll.poll()
返回事件POLLNVAL
对于无效的已注册FDS。以前,它倾向于同时报告读和写事件。
文件对象#
FileObjectPosix
显示read1
方法处于读取模式时,通常只公开与它所处的模式相应的方法。FileObjectPosix
支持 蟾蜍尺码 二进制写入模式下为0。报告时间: issue #840 作者:Mike Lang。Python 3:
gevent.socket.connect_ex()
正在出租BlockingIOError
由于在python 3.3中重构了异常层次结构,所以(可能还有其他人)被提升,而不是返回errno。现在返回errno。报告时间: issue #841 达娜·鲍尔斯。
其他变化#
Group
和Pool
现在返回是否join()
返回空组。由Filippo Sironi在 pull request #503 .杀死greenlet的未处理异常报告现在包含时间戳。见 issue #137 .
PriorityQueue
现在确保初始项列表是有效的堆。固定在 pull request #793 作者:X.C.Dong。gevent.hub.signal
(阿卡gevent.signal()
)现在确认handler
参数是可调用的,引发TypeError
如果没有,报告在 issue #818 作者:Peter Renstr_m.如果
sys.stderr
已进行猴修补(不推荐),但集线器报告没有丢失,仍然可以捕获的例外。报告时间: issue #825 杰尔·斯密特。这个
gevent.os.waitpid()
在更多情况下,功能是合作的。报告时间: issue #878 作者:Heungsub Lee。各种各样
FileObject
实现之间更加一致。 注: 写信给 io FileObject的属性应视为已弃用。超时异常(和其他异步异常)可能导致后门服务器无法正确管理stdout/stderr/stdin值。报告有补丁 pull request #874 作者:Stefanmh。
后门服务器现在跟踪生成的greenlet(连接),并在其
stop
方法。
服务器#
绑定到所有地址(例如“”)时,默认为af inet6。这同时支持IPv4和IPv6连接(在Windows上除外)。原始变更 pull request #495 费利克斯·凯撒。
pywsgi/performance:当传输编码被分块时,应用程序返回的数据块在发送到套接字之前不再被复制,这可能会降低大型响应的开销。
线程#
添加
gevent.threadpool.ThreadPoolExecutor
(A)concurrent.futures.ThreadPoolExecutor
即使系统被猴修补,也始终使用本机线程的变体concurrent.futures
可用(python 3和python 2futures
安装了后端口)。这有助于,例如,GRPC。报告时间: issue #786 作者:马库斯·帕杜雷克。在Monkey修补线程之前创建的本机线程现在可以连接。在之前的python<3.4中,这样做会提高
LoopExit
错误。报告时间: issue #747 作者:Sergey Vasilyev。
SSL#
在python 2.7.9及更高版本上(更常见的是,当python 2中存在ssl backport时)。
gevent.ssl.get_server_certificate()
会提高ValueError
如果系统没有被猴子修补。报告时间: issue #801 作者:Gleb Dubovic。在python 2.7.9和python 3上,在一个greenlet中关闭一个ssl套接字,而在另一个greenlet中读取或写入它时,不太可能引发
TypeError
而不是ValueError
. 报告时间: issue #800 作者:陈凯文。
子流程模块#
在之后将sigchld设置为sig_ign或sig_dfl
gevent.subprocess
以前使用过的不能逆转,导致Popen.wait
以及其他挂起的电话。现在,如果SIGCHLD被忽略,下次gevent.subprocess
这将被自动检测和纠正。(这可能导致os.popen()
在python 2上,但信号总是可以再次重置。混合低级处理调用、低级信号管理和高级使用gevent.subprocess
很棘手。)报告 issue #857 作者:Chris Utz。Popen.kill
和send_signal
不再尝试向已知已退出的进程发送信号。
对子进程模块的几个向后兼容的更新已经从python 3返回到python 2,使 gevent.subprocess
更小,更容易维护,在某些情况下更安全。
即使在python 2上,popen对象也可以用作上下文管理器。高级API函数 (
call
等等)为了增加安全性而使用这个。这个
gevent.subprocess
模块现在提供gevent.subprocess.run()
在所有受支持的python版本上,以合作的方式运行,即使系统没有被猴补丁。(它是在python 3.5中正式添加的。)popen对象保存其 args 属性,即使在python 2上也是如此。
gevent.subprocess.TimeoutExpired
甚至在python 2上定义,其中它是gevent.timeout.Timeout
例外;所有实例Timeout
先前在python 2下引发的异常现在将引发TimeoutExpired
例外。gevent.subprocess.call()
(和check_call
)接受 超时 python 2上的关键字参数。这在Python3上是标准的,但在Python2上是一个gevent扩展。gevent.subprocess.check_output()
接受 超时 和 输入 python 2上的参数。这在Python3上是标准的,但在Python2上是一个gevent扩展。