Gevent 1.0的新功能#

详细信息见 1.0版的更改 . 以下是0.13.8之后所有更改的摘要。

gevent 1.0支持python 2.5-2.7。所需的greenlet版本为0.3.2。源分发现在包括依赖项(libev和c-ares),除了greenlet之外没有依赖项。

新核心#

现在事件循环使用libev而不是libevent(有关动机,请参阅http://blog.gevent.org/2011/04/28/libev-and-libevent/)。

新的 gevent.core 已重写以包装libev的API。(在窗户上, gevent.core 接受Windows句柄而不是stdio文件描述符)。

用标准信号模块设置的信号处理程序不再被事件循环阻塞。

事件循环现在可以插入。gevent_loop环境变量可以指定要使用的替代类(默认为 gevent.core.loop

错误处理现在由hub.handle_error()完成。

通常杀死进程的系统错误(系统错误、系统退出、键盘中断)现在在主greenlet中重新出现。因此 sys.exit() 当运行在一个绿地不再被困,并按预期杀死过程。

新建DNS解析程序#

两个新的DNS解析程序:基于线程池的一个(默认启用)和基于C-ARES的一个。基于线程池的解析器主要是为Windows和Mac OS X平台添加的,在这些平台中,C-ares的行为可能与W.R.T系统配置有所不同。然而,在Linux上,基于C-ARES的解析器可能是更好的选择。要启用C-ARES解析器,请设置gevent_resolver=ARES环境变量。

这修复了0.13.x上的DNS的一些主要问题,即:

  • Issue #2: DNS resolver no longer breaks after fork(). You still need to call gevent.fork() (os.fork is monkey patched with it if monkey.patch_all() was called).

  • DNS解析程序不再忽略 /etc/resolv.conf/etc/hosts .

以下功能已添加到插座模块:

  • gethostbyname_ex

  • GETNAMEFIN信息

  • 获取主机地址

  • 获取fqdn

它可以实现您自己的DNS解析程序并使gevent使用它。gevent_resolver变量可以使用以下格式指向替代实现: package.module.class . 默认值为 gevent.resolver_thread.Resolver . 替代的“战神”分解器是 gevent.resolver_ares.Resolver .

新API#

  • gevent.wait() and gevent.iwait()

  • udp服务器:gevent.server.datagramserver

  • 子流程支持

    新的 gevent.subprocess 协同实现标准子流程模块的接口。可以使用 patch_all(subprocess=True) (默认情况下不执行)。

  • 线程池

    警告: 此功能是实验性的,应小心使用。

    这个 gevent.threadpool 模块提供了通常的池方法(apply、map、imap等),但在实际的OS线程中运行传递的函数。

    有一个默认的线程池,可用为 gevent.get_hub().threadpool .

正在中断更改#

删除的功能#

  • gevent.dns模块(围绕libevent dns的包装)

  • gevent.http模块(围绕libevent http的包装)

  • util.lazy_property 财产。

  • 已弃用的gevent.sslold模块

  • 已弃用的gevent.rawgreenlet模块

  • 不推荐使用的名称 GreenletSet 它以前是的别名 Group .

  • 链接到greenlet的greenlet功能

  • 未记录的bind_and_listen和tcp_listener

已将gevent.coros重命名为gevent.lock。gevent.coros仍然可用,但已弃用。

API更改#

在所有服务器中,方法“kill”被重命名为“close”。旧名称可用作已弃用的别名。

  • Queue(0) 现在等价于未绑定的队列并引发 DeprecationError . 使用 gevent.queue.Channel 如果你需要一个频道。

这个 gevent.Greenlet 物体:

  • 补充 __nonzero__ 返回的实现 True 在格林莱特被启动到死后。这超过了格林莱特的 __nonzero__ 它回来了 False 之后 start() 直到第一次切换到。

错误修正#

  • 问题302:“python-m gevent.monkey”现在设置 __file__ 正确。

  • 问题143:Greenlet链接现在按添加的顺序执行

  • 修正了monkey.patch_thread()来修补线程。_dummethread以避免线程泄漏。_active。

  • 线程:allocate_lock现在是locktype/信号量的别名。这样,当用作类成员时它不会失败。

  • 现在可以在游泳池里加入生的小菜了。

  • 这个 map()imap() 方法现在开始尽快生成结果。

  • 这个 imap_unordered() 不再吞咽在迭代其参数时引发的异常。

  • gevent.sleep(<negative value>) 不再引发异常,而是引发异常 sleep(0) .

  • 这个 WSGIServer 现在集 max_accept 至1如果 wsgi.multiprocessing 设置为 True .

  • 补充 monkey.patch_module() Monkey补丁模块使用的功能 __implements__ list provided by gevent module. All of gevent modules that replace stdlib module now have `_ _实现属性。

皮夫斯基:

  • 在Unix套接字上绑定时修复日志记录(295)。

  • 读取请求数据以防止EconnReset

  • 修复79:正确处理HTTP版本。

  • 修复86:现在支持bytearray。

  • 修复92:在截断的POST请求上引发IOERROR。

  • 修正93:不发送多个“100继续”响应

  • 修复116:多行HTTP头现在被正确处理。

  • 修复216:传播pool.map/imap引发的错误

  • 修复pywsgi中的“requestline”attributeError。

  • 如果将非零内容长度传递给Start_Response(204/304),或者尝试为304/204响应写入非空正文,则引发断言错误。

  • 如果尚未设置“status”属性,请确保格式_request()不会失败。

  • 已将远程端口变量添加到环境中。

  • 已从wsgihandler中删除未使用的不推荐使用的“wfile”属性