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。同样,更正参数名称 fromfdsocketpair 在python 2上,尽管不能用cpython下的关键字参数调用它们。

    备注

    这个 gethost* 函数在cpython和pypy下使用不同的参数名。尽管不能用cpython上的关键字参数调用这些函数,但gevent遵循cpython约定。

  • 以前的singleton异常对象 FileObjectClosedcancel_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.corecextgevent.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.osgevent.signalgevent.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 达娜·鲍尔斯。

其他变化#

  • GroupPool 现在返回是否 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 2 futures 安装了后端口)。这有助于,例如,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.killsend_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扩展。