GEvent 1.0的变化

版本1.0.2

  • 修复lifoqueue.peek()以返回正确的元素。 pull request #456 . 由Christine Spang修补。

  • 升级至libev 4.19

  • 完全删除ssl3作为默认的tls协议

  • 在Windows上导入套接字(关闭 issue #459

  • 修复c90语法错误 (pull request #449

  • 添加与Python2.7.9的SSL更改的兼容性。 issue #477 .

版本1.0.1

  • 固定 issue #423 :池的imap/imap无序可能永远挂起。基于王建飞的补丁和测试。

1.0版(2013年11月26日)

  • pywsgi:传递错误列表的副本,而不是直接引用。感谢Jonathan Kamens,Matt Iversen。

  • 忽略自动生成的doc/gevent.*.rst文件。马蒂亚斯·乌里希斯的补丁。

  • 在窗户上安装cythonpp.py。Jeryn Mathew的补丁。

  • 移除gevent.run(使用gevent.wait)。

版本1.0RC3(2013年9月14日)

  • 固定 issue #251 :访问损坏的循环时gevent.core崩溃。

  • 固定 issue #235 :将hub.py中的self.threadpool.close()替换为self.threadpool.kill()。Jan Philip Gehrcke的补丁。

  • 从select.py中删除未使用的超时 (issue #254 )。由sa_l ibarra corretg_修补。

  • 将greenlet.link()的参数重命名为“callback”(关闭 issue #244

  • 修复并行构建 (issue #193 )。由Yichao Yu修补。

  • 固定 issue #263 :gevent.pywsgi中可能存在unboundlocalerror:“length”。

  • 简化psycopg2_pool.py (issue #239 )。亚历克斯·加诺的补丁。

  • pywsgi:在get请求中允许内容长度 (issue #264 )。陈小玉补。

  • 文档修复 (issue #281 ) [飞利浦康拉德] .

  • 修复有关kill、killall的默认阻止行为的旧文档 (issue #306 )。丹尼尔·法里纳的补丁。

  • 固定 issue #6 :在线程后修补sys。安东·帕特鲁舍夫的补丁。

  • 子进程:修复py2.6及更低版本上的check_输出 (issue #265 )。感谢马克西布森的测试。

  • 固定 issue #302 :“python-m gevent.monkey”现在设置 __file__ 正确。

  • pywsgi:在Unix套接字上绑定时修复日志记录 (issue #295 )。感谢克里斯·梅耶斯,尤金·潘科夫。

  • pywsgi:读取请求数据以防止econnreset

  • 固定 issue #303 :pywsgi中的“requestline”attributeError。感谢尼尔·钦托比。

  • 固定 issue #79 :正确处理HTTP版本。Luca Wehrstedt的补丁。

  • 固定 issue #216 :传播pool.map/imap引发的错误

版本1.0RC2(2012年12月10日)

  • 固定的 issue #210 :没有为非默认循环运行回调(1.0rc1中引入的bug)。

  • patch_all()不再修补子进程,除非 subprocess=True 通过。

  • 已修复hub.waiter中的属性错误。

  • 固定的 issue #181 :使隐藏导入对冻结工具(如py2exe)可见。由拉尔夫施密特修补。

  • 固定的 issue #202 :运行回调时定期返回(sleep(0)现在无法阻塞事件循环)。

  • 固定的 issue #204 :os.tp_read/tp_write没有向调用方提供错误。

  • 固定的 issue #217 :不要在Windows上设置此地址。

  • 修正了gevent.monkey的模块参数中的错误。_RJAN PERSSON修补。

  • 删除threadpool.py中有关混合叉()和线程的警告。

  • 从支持旧greenlet所需的代码中清除了hub.py。由sa_l ibarra corretg_修补。

  • 允许通过 get_hub(default=True) . Jan Philip Gehrcke的补丁。

版本1.0RC1(2012年10月30日)

  • 固定的hub.switch()在切换时不触摸stacktrace。greenlet正确还原0.3.2版之后的异常信息。GEvent现在需要greenlet>=0.3.2

  • 添加了gevent.wait()和gevent.iwait()。这类似于gevent.joinall(),但支持更多对象,包括greenlet、event、semaphore和popen。如果没有参数,它将等待事件循环完成(以前的gevent.run()就是这样做的)。在最终发布之前将删除gevent.run,并且gevent.joinAll()可能会被弃用。

  • 使用一个列表和一个Prepare Watcher重新实现loop.run_回调;这可以修复生成顺序并稍微提高性能。

  • 修复信号量/锁不到中的init hub __init__ 这样就可以在不初始化集线器的情况下拥有模块全局锁。这将修复monkey.patch_all()而不是初始化集线器。

  • 按添加顺序执行回调的新实现。core.loop.callback已删除。

  • 固定的2.5兼容性。

  • 修复了请求“stat”观察程序的“prev”和“attr”属性时Windows崩溃的问题。属性访问仍然失败,但现在出现异常。

  • 添加了已知的_failures.txt,列出了所有失败的测试。它可以通过预期的选项由testranner.py使用。它用于在Travis中运行测试套件。

  • 修正了socket、ssl和fileobject以不掩盖ebadf错误-它现在被提供给调用者。以前,EBADF被转换为空读/写。多亏了维塔利·克鲁格利科夫

  • 已删除gevent.event.waitall()。

  • 重命名的fileObjectThreadpool->fileObjectThread

  • 格林莱特:固定 issue #143 :greenlet链接现在按添加的顺序执行。

  • 使用信号量同步对FileObjectThread的访问

  • 在FileObject中不再处理einval。

猴子:

  • 固定的 issue #178 :禁用monkey补丁os.read/os.write

  • 修正了monkey.patch_thread()来修补线程。_dummethread以避免线程泄漏。_active。Wil Tan的原始补丁。

  • 为patch_all()和patch_线程添加了event=false参数

  • 添加了patch_sys(),它用fileObjectThread包装器来修补stdin、stdout和stderr。实验/马车。

  • 猴子修补所有东西不再初始化中心/事件循环。

Socket:

  • 创建连接:如果不支持IPv6,请不要查找IPv6地址。由拉尔夫施密特修补。

皮夫斯基:

  • 固定的 issue #86 :现在支持bytearray。Aaron Westendorf的原始补丁。

  • 固定的 issue #116 :多行HTTP头现在处理正确。由拉尔夫施密特修补。

子过程:

  • 修复了Windows兼容性。wait()方法现在还支持Windows上的“timeout”参数。

  • popen:添加了rawlink()方法,使gevent.wait()支持popen对象。更新的示例/流程.py

  • 固定的 issue #148 :从errpipe读取以小块读取,以避免在Mac OS X上触发einval问题。

  • 在“finally”部分执行os.exit(),以避免执行不相关的代码。Vitaly Kruglikov的补丁。

分解器:

  • 改进getaddrinfo:对于字符串端口(例如“http”)来说,resolver_ares/getaddrinfo以前只检查过getservbyname(port,“tcp”)或getservbyname(port,”udp”),但从来没有检查过两者。现在检查两个。

  • gevent.ares.channel现在接受字符串作为参数

  • 升级c-ares至cares-1_9_1-12-g805c736

  • 现在可以使用环境直接配置解析器,如geventares服务器。

操作系统:

  • 已将threadpool_读/写重命名为tp_读/写。

  • 删除了posix-read和posix-write。

  • 添加nb_read、nb_write、make_nonblocking。

集线器:

  • 在所有情况下,系统错误都会立即在主greenlet中出现。

  • 放弃对旧greenlet版本的支持(现在需要大于等于0.3.2)

核心:

  • 允许将观察程序的“callback”属性设置为“none”。del w.callback“不再工作。

  • 添加了缺少的“nonotify”标志

MISC:

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

  • 更新greentest.py以开始超时 ref=False .

  • pool:删除未使用的get_values()函数

  • setup.py现在识别geventsetup_ev_verify env var,该变量在编译时设置ev_verify宏

  • 增加了一些微观基准

  • 我们关心的stdlib测试现在包含在greenttest/2.x目录中,因此我们不依赖于它们在系统范围内的安装。

  • 更新了util/makedist.py

  • 测试运行程序被完全重写。

版本1.0B4(2012年9月6日)

  • 添加了带有“读”和“写”功能的gevent.os模块。Geert Jansen的补丁。

  • 将gevent.hub.fork移动到gevent.os模块(它仍可用作gevent.fork)。

  • 固定的 issue #148 :made fileobject句柄einval,由mac os x上的os.read/os.write随机引发。多亏了mark hingston。

  • 固定的 issue #150 :gevent.fileobject.socketadapter.sendall()可能不必要地等待描述符上的写入事件。马克·辛斯顿的原版补丁。

  • 修复了baseserver中的attributeError。如果出现错误,start()将调用kill(),并将其重命名为close()。多亏了维塔利·克鲁格利科夫。

版本1.0b3(2012年7月27日)

  • 新建gevent.subprocess模块

  • 新建gevent.fileobject模块

  • 修复了threadpool以尽快丢弃传递给它的对象(函数、参数)的引用。以前,它们可以无限期地存储,直到线程得到一个新的作业。

  • 固定的 issue #138 :gevent.pool.pool().imap无序挂起,迭代器为空。多亏了Exproxus。

  • 固定的 issue #127 :ssl.py在某些情况下可能引发类型错误。感谢Johan Mjones。

  • 修正了socket.makefile()以保持socket实例的超时设置。感谢科林·马克。

  • 已将“copy()”方法添加到队列中。

  • “nochild”事件循环配置选项已删除。安装符号提供了更灵活的方式来启用儿童观察者。

  • 核心:除了'child'之外的所有观察程序现在接受新的'priority'关键字参数

  • 超时接受新参数:“ref”和“priority”。超时的默认优先级是-1。

  • hub.wait()现在使用waiter而不是原始切换

  • 将libev更新为最新的cvs版本

  • 如果将非零内容长度传递给start_-response(204/304),或者如果试图为304/204响应写入非空正文,则生成pywsgi以引发断言错误。

  • 删除了pywsgi功能,以便将传递的头大写。

  • 固定的util/cythonpp.py用于python3.2 (issue #123 )。Alexandre Kandalintsev的补丁。

  • 已将“closed”只读属性添加到套接字。

  • 已将“ref”读/写属性添加到套接字。

  • 除了嵌入,setup.py现在解析关心嵌入和libev嵌入参数。

  • gevent.reinit()和gevent.fork()仅在创建了reinit hub而不是自己创建时才创建它

  • 修正了不添加libev和c-ares的setup.py,在非嵌入模式下包含dir。由拉尔夫施密特修补。

  • 已将util/make-dist.py重命名为util/makedist.py

  • testranner.py现在可以保存关于系统的更多信息;stat打印功能将移动到单独的util/stat.py脚本中。

版本1.0B2(2012年4月11日)

主要和向后不兼容的更改:

  • 已将基于线程池的冲突解决程序设为默认值。要启用基于战神的分解器,请设置gevent_resolver=ares env var。

  • 添加了对儿童观察者的支持(在Windows上不可用)。

    • libev循环现在默认获取所有子循环。

    • 如果将nochild标志传递给循环,则禁用子观察程序和子收获。

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

  • 向循环添加了“stat”观察程序。

  • 现在,setup.py可以识别gevent_embed env var。当设置为“no”时,捆绑的c-ares和libev将被忽略。

  • 向sleep()添加了可选的“ref”参数。当ref=false时,由sleep()创建的观察程序不保持gevent.run()退出。

  • 线程池现在为工作线程中的异常调用hub.handle_错误。

  • ThreadPool得到了新的方法:应用。

  • 添加了新的扩展模块gevent.u util并将gevent.core.setu excu info函数移到那里。

  • 增加了新的扩展模块gevent._信号灯。它包含由gevent.lock作为gevent.lock.semaphore导入的信号量类。在扩展模块中提供信号量可确保在 __exit__. 感谢拉尔夫·施密特。

  • 现在可以通过设置线程池的“大小”属性来终止或预生成线程。

核心:

  • 确保默认循环不能被破坏多次,从而导致进程崩溃。

  • make hub.destroy()方法不销毁默认循环,除非 destroy_loopTrue . 默认情况下,非默认循环仍会被销毁。

  • 循环:已从循环中删除属性:fdchangecnt、timercnt、asynccnt。

  • 循环:添加的属性:sigfd、origflags、origflags_int

  • 循环:evflag eu noenv现在总是传递给libev。因此,不再检查libev_flags env变量。使用gevent_后端。

MISC:

  • 检查link()的参数是否可调用。否则引发typeerror。

  • 修复了分析地址时BaseServer中的类型错误。

  • 池:使外部用户可以使用add()和discard()。多亏了丹尼尔·埃雷米耶夫。

  • 指定要导入的类时,现在可以使用格式path/package.module.name

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

  • pywsgi:向环境中添加了远程端口变量。

实例:

  • 现在,portForwarder.py演示了如何使用gevent.run()实现服务器的正常关闭。

  • psycopg2_pool.py:已将execute()更改为返回行数。

  • psycopg2_pool.py:添加了fetchall()和fetchiter()方法。

开发工具:

  • 构建时,可以使用cython env变量指定要使用的cython可执行文件。

  • util/make-dist.py现在可以恢复——快速和——恢复选项。上一个--rsync选项被删除。

  • 添加了util/winvbox.py,它可以在WindowsVM上自动生成/测试/生成二进制文件。

  • 修复了testranner.py中异常处理代码的拼写错误

  • 在python2.7上固定修补单元test.runner。这导致测试用例运行的细节丢失。

  • 在测试完成后,使testranner.py终止整个进程组。

版本1.0b1(2012年1月10日)

向后不兼容的更改:

  • 删除了greenlet的“链接到greenlet”功能。

  • 如果使用大于0.3.2的Greenlet模块,则 greenlet.GreenletExit.__bases__ 是否修补了monkey以从baseexception派生而非exception。这样,无论安装的greenlet版本如何,gevent.greenletexit始终从baseexception派生。

  • 已经删除了一些支持python 2.4的代码。

发布亮点:

  • 添加线程池:gevent.thread pool.threadpool。

  • 添加了基于线程池的冲突解决程序。启用gevent_resolver=thread。

  • 添加了udp服务器:gevent.server.datagramserver

  • 现在在libev上运行“configure”。这解决了Mac OS X上“kqueue”不可用的问题。

  • GEvent现在识别了一些环境变量:

    • gevent_backend允许将参数传递给循环,例如,对于force select backend,“gevent_backend=select”

    • gevent_resolver允许选择resolver类。

    • gevent_thread pool允许选择线程池类。

  • 新增示例:portforwarder、psycopg2_pool.py、threadpool.py、udp_server.py

  • 修复了非嵌入生成。要根据系统libev生成,请删除或重命名“libev”目录。要根据系统C-ARES进行构建,请删除或重命名“C-ARES”。多亏了扬·佩尔森。

MISC:

  • gevent.joinAll()方法现在接受可选的“count”关键字。

  • 现在只在子进程中调用reinit()。

  • 现在,由于超时或事件(以前为无),退出时gevent.run()返回false。

  • Hub得到了一个新方法:destroy()。

  • Hub获得了一个新属性:threadpool。

战神.pyx:

  • 固定的 issue #104 :使战神的主机结果可供选择。感谢肖恩·卡特。

皮夫斯基:

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

  • 固定的 issue #92 :在截断的POST请求上引发IOERROR。

  • 固定的 issue #93 :不要发送多个“100继续”响应

核心:

  • 固定的 issue #97 :计时器观察程序现在在start()中调用ev_now_update(),然后再次调用ev_update(),除非传递了'update'关键字并将其设置为false。

  • 添加set_syserr_cb()函数;它由gevent内部使用。

  • gevent现在使用libev的set_syserr_cb安装syserr回调。当libev遇到无法恢复的错误时,调用此回调。默认操作是打印消息并中止。安装回调后,现在在主greenlet中引发SystemError()。

  • 已将“backend_fd”属性重命名为“fileno()”方法。(如果针对系统libev构建gevent,则不可用)

  • 添加了“asynccnt”属性(如果针对系统libev生成gevent,则不可用)

  • 制造的 loop.__repr__ 输出更紧凑一点

  • 观察者现在检查参数是否有效(以前无效的参数会使libev崩溃)。

  • “async”观察程序现在有send()方法;

  • 固定时间()函数

  • libev已经升级到最新的cvs版本。

  • 当libev_vfd.h生效时,libev已被修补为在Windows上对evpipe使用send()/recv()。

分解器:

  • 在某些错误情况下稍微改进了与stdlib套接字的兼容性。

Socket:

  • fixed close()方法不引用任何全局

  • 固定的 issue #115 :_dummy获得意外的超时参数

  • 删除了用于在socket.py中兼容python 2.4的文件对象

  • 固定的 issue #94 :如果memoryview在python 2.7的get内存中失败,则返回缓冲区

猴子:

  • 已删除修补程序httplib()

  • 固定的 issue #112 :线程。_睡眠没有修补。多亏了大卫·拉比森尼尔。

  • 添加了get_unpatched()函数。不过,目前它有点破损。

后门:

  • 使“locals()”不溢出 __builtin__.__dict__ 在后门

  • 向后门服务器添加可选横幅参数

服务器:

  • 添加server.datagramserver;

  • streamserver:“ssl_enabled”现在是只读属性

  • 服务器不再具有“kill”方法;已将其重命名为“close”。

  • 现在可以将侦听器配置为字符串,例如“80”或“80”

  • 修改baseserver.baseserver,使其成为streamserver和datagramserver的好基类

  • BaseServer不再接受“backlog”参数。现在由streamserver完成。

  • BaseServer实现start_accepting()和stop_accepting()方法

  • BaseServer现在实施“暂时停止接受”策略

  • BaseServer现在有一个读取方法,它可以执行除实际调用accept()/recvFrom()之外的所有操作。

  • pre_start()方法被重命名为init_socket()。

  • 已将“停止”事件重命名为“停止”事件

  • “started”现在是只读属性(它实际上报告了“stop”事件的状态)

  • 删除post_Stop()方法

  • close()现在将_stop_event()设置为false,从而使serve_forever()退出

  • _ tcp_listener()函数从baseserver.py移动到server.py

  • 添加了“致命错误”类属性,它是所有应杀死服务器的errnos的元组。

coros:

  • 信号量:add _start _notify()方法

  • 信号量:避免复制链接列表;rawlink()不再计划通知

版本1.0A3(2011年9月15日)

已将“ref”属性添加到所有观察程序。将其设置为“假”,使观察程序适当地调用ev-unref/ev-ref,这样该观察程序就不会阻止loop.run()/hub.join()/run()退出。使冲突解决程序使用内部观察程序的“ref”属性。

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

向循环添加了一些属性:backend_fd、fdchangecnt、timercnt。

将c-ares升级到1.7.5+补丁。

修正了getaddrinfo返回结果的顺序(::1,ipv4,ipv6)。

修正了getaddrinfo()来处理字符串类型的整数。多亏了科诺。

已将gethostbyname()修复为处理“”(空字符串)。

修正了getAddrInfo()将unicodeEncodeError转换为错误(“应为int或string”)。

固定的getaddrinfo()使用与内置套接字类似的最低16位传递端口整数。

修正了getnameinfo()调用getaddrinfo()来处理类似于内置套接字的参数。

已修复gethostbyddr()以使用getaddrinfo()处理参数。

版本信息现在是5元组。

将handle_system_error()方法添加到hub(内部使用)。

修复了hub的run()方法以永不退出。这可以防止不适当地转换为父greenlet。

修复了hub.join()以返回true(如果hub已经死了)。

已将“event”参数添加到hub.join()。

补充 run() Gevent顶层包的功能。

修正了greenlet.start()在greenlet已经启动而不是提升时自动退出 AssertionError .

修正了greenlet.start()在greenlet已经死的情况下不调度另一个开关。

修正了gevent.signal()生成greenlet而不是原始greenlet。此外,它将立即切换到新的greenlet,而不是安排额外的回调。

Do Monkey Patch create_connection(),因为gevent的版本比标准的create_connection更适合gevent.socket.socket。

Pywsgi:如果套接字操作因epipe而失败,请确保我们不会尝试读取更多请求。

Pywsgi:如果我们未能发送回复,请将“status”更改为socket error,以便日志中提到该错误。

版本1.0A2(2011年8月2日)

修复了gevent.queue.channel类中的错误。(多亏了亚历克赛·博泽科夫)

版本1.0A1(2011年8月2日)

向后不兼容的更改:

  • 放弃了对python 2.4的支持。

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

  • 不推荐将greenlet实例传递给 Greenlet.link()Greenlet.link_value()Greenlet.link_exception() .

  • 所有的 gevent.core 已重写,接口不兼容。

  • SystemExitSystemError 现在停止整个过程而不是打印一个回溯。

  • 已删除,已弃用 util.lazy_property 财产。

  • 远离的 gevent.dns 模块。

  • 已删除不推荐使用的gevent.sslold模块

  • 已删除已弃用的gevent.rawgreenlet模块

  • 删除了不推荐的名称 GreenletSet 它以前是的别名 Group .

  • gevent.wsgi 现在是的不推荐使用的别名 gevent.pywsgi .

发布亮点:

  • 这个 gevent.core 模块现在包装了libev的API,与gevent 0.x不兼容。

  • 增加了可插拔事件循环的概念。默认情况下,使用gevent.core.loop,它是libev的包装器。

  • 添加了可插拔名称解析程序的概念。默认情况下,使用基于C-ARES库的解析器。

  • 增加了对多个操作系统线程的支持,每个新线程都将使用自己的事件循环获得自己的中心实例。

  • 该版本现在包含并嵌入了依赖项:libev和c-ares。

  • 标准 signal 现在按预期工作。

  • 未处理的错误现在由统一处理 Hub.handle_error 功能。

  • 补充 gevent.queue.Channel 类到 gevent.queue 模块。它相当于 Queue(0) 在gevent 0.x中,现在已弃用。

  • 添加的方法 peekgevent.queue.Queue 班级。

  • 补充 idle 在事件循环空闲之前阻塞的函数。

  • 通过等待所有未完成的greenlet/servers/watcher,添加了一种优雅地关闭应用程序的方法: Hub.join .

  • 新增 gevent.ares C延长线 c-ares 并提供异步DNS解析程序。

  • 新增 gevent.resolver_ares 模块在 gevent.ares .

这个 gevent.socket 模块:

  • dns函数现在使用c-ares库而不是libevent dns。这修复了名称解析的一些问题:

    • Fix 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

  • 删除了未记录的bind_和_listen以及tcp_listener

这个 gevent.hub.Hub 对象:

  • 补充 join 方法,等待事件循环退出或可选超时过期。

  • 补充 wait 方法,该方法等待观察程序获取事件。

  • 补充 handle_error 方法,在发生未处理的异常时由所有gevent调用。

  • 补充 print_exception 由调用的方法 handle_error 打印异常跟踪。

这个 Greenlet 物体:

  • 补充 __nonzero__ 返回的实现 True 在格林莱特被启动到死后。以前格林莱特是 False 之后 start() 直到第一次切换到。

这个 gevent.pool 模块:

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

  • 这个 mapimap 方法现在开始尽快生成结果。

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

其他:

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

  • 添加的方法 clear 到内部 Waiter 班级。

  • 远离的 wait 来自内部的方法 Waiter 班级。

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

  • 补充 gevent.monkey.patch_module() Monkey补丁模块使用的功能 __implements__ GEvent模块提供的清单。所有替换stdlib模块的gevent模块现在都有 __implements__ 属性。

Next page: Gevent 1.0之前的更改