后端【免费下载链接】geventCoroutine-based concurrency library for Python项目地址https://gitcode.com/gh_mirrors/ge/gevent点击查看免费下载gevent 1.1 是该项目从 Python 2 时代迈向多运行时时代的关键里程碑从 1.1a1 到 1.1.2 共 16 个发布主线围绕 Python 3.3/3.4 与 PyPy 的完整支持、子进程与信号处理机制的重新设计fork_and_watch / waitpid / SIGCHLD、monkey-patch 行为的规范化以及对 Event、Queue、SSL Socket、pywsgi 等核心模块的大量竞态与标准库对齐修复。本文以 docs/changelog_1_1.rst 为骨架结合当前仓库源码src/gevent 下的实现与 src/gevent/tests 中的回归测试逐条解读每个版本的关键变更帮助你理解 gevent 1.1 的内部原理、升级影响面与踩坑点并为阅读更新版本1.21.5的变更日志建立完整的演进脉络。1. 版本总览从 1.1a1 到 1.1.2 的发布线gevent 1.1 系列按alpha → beta → rc → 正式版的节奏推进完整时间线如下版本发布日期定位1.1a12015-06-29加入 Python 3.3/3.4 与 PyPy 支持丢弃 Python 2.51.1a22015-07-08ThreadPool/selectors/SSL/subprocess 系列改进1.1b12015-07-17fork_and_watch 引入Semaphore 在 PyPy 上原子化1.1b22015-08-05c-ares 解析器可用于 PyPyCFFI 后端可在 CPython 上构建1.1b32015-08-16Queue 顺序化、imap_unordered 的 maxsize、sendall 性能1.1b42015-09-04SIGCHLD/child watcher 协作、-O 优化下的错误检测1.1b52015-09-18Python 3.5 初步支持、forkpty 子进程监视1.1b62015-10-17PyPy 内存泄漏修复、Windows Python 3.5 wheels1.1rc12015-11-14Windows/Python 3 的 subprocess 移植完成1.1rc22015-12-11SSL 异常与标准库对齐、CFFI 后端加固1.1rc32016-01-04PEP 466 ssl 接口、WSGI PATH_INFO 按 latin-1 解码1.1rc42016-02-16BaseServer 降低每请求开销、SSL 主机名校验1.1rc52016-02-24SSL sendall 空数据行为对齐1.1.02016-03-05正式版RLock、Event 竞态、patch_all 警告1.1.12016-04-04嵌套回调、sendmsg/recvmsg、Solaris 101.1.22016-07-21sendall 假超时、selectors 补丁顺序、reload(site)该文档在仓库中由 docs/changelog.rst 的Older Releases章节通过 toctree 引用属于无上下文的历史变更记录仓库根目录的 CHANGES.rst 则只覆盖当前版本线。2. 三大里程碑Python 3、PyPy 与 Python 2.5 告别1.1a1 一举奠定了后续所有版本的基础新增 Python 3.3 与 3.4 支持对应 issue 38。这是社区多人协作的结果后续 1.1rc1Windows 平台、1.1b5Python 3.5 初步支持与 1.1.1sendmsg/recvmsg 等新接口都在此基础上持续补齐。新增 PyPy 支持对应 issue 248官方建议使用包含 CFFI 1.2.0 的较新 PyPy 构建。1.1rc2 进一步明确最低要求PyPy 2.6.1 或以上推荐 4.0.1 或以上。丢弃 Python 2.5文档明确Python 2.5 用户可以继续使用 gevent 1.0.x这意味着 1.1 是最低要求 Python 2.6 的版本线。依赖也随之升级libev 从旧版升级到4.20PR 590c-ares 升级到1.10.0PR 579。注意 c-ares 的 configure 脚本对CFLAGS、LDFLAGS等环境变量内容变得更加严格——例如CFLAGS不再允许包含-I指令这类 include 路径必须放到CPPFLAGS中否则配置阶段会失败。仓库中 deps 目录保留了 deps/c-ares 与 deps/libev 的完整源码副本可供核对。3. monkey 模块patch_all 新警告与补丁语义规范化1.1.0 对gevent.monkey.patch_all引入了两条会影响所有使用者的行为变更并在 src/gevent/monkey/init.py 的 docstring 中以versionchanged:: 1.1明确记录见 src/gevent/monkey/init.py3.1 osFalse signalTrueSIGCHLD 陷阱当patch_all(osFalse)但signal保持默认的 True 时会发出警告该组合会导致SIGCHLD处理器不被调用os.waitpid在配合gevent.subprocess时也可能行为异常未来可能直接升级为报错。其实现位于 src/gevent/monkey/init.py 的_subscribe_signal_osdef _subscribe_signal_os(will_patch_all): if will_patch_all.will_patch_module(signal) and not will_patch_all.will_patch_module(os): _queue_warning(Patching signal but not os will result in SIGCHLD handlers installed after this not being called and os.waitpid may not function correctly if gevent.subprocess is used. This may raise an error in the future., warnings)3.2 重复调用 patch_all 的累积语义以不同参数多次调用patch_all会发出警告后续调用只会累积更多 True 参数的补丁永远无法通过传 False 撤销已生效的补丁。其核心逻辑在_check_repatchingsrc/gevent/monkey/init.py首次调用记录各参数设置后续调用对比时凡是之前未 True 而现在为 True的模块会被加入待补丁集合已 True 的保持不变导致最终补丁集合是所有调用参数的并集。3.3 get_original 与 selectors 补丁get_original 修复1.1.0 修复了gevent.monkey.get_original对某些threading属性返回原值不正确的问题保证能取回标准库真实实现当前仓库中_monitor.py等内部模块正是依赖get_original获取原生thread.get_ident与time.sleep。selectors 补丁顺序1.1.2 修复selectors.SelectSelector的 monkey-patch 与导入顺序相关的问题issue 835现在无论selectors何时被导入补丁都能正确生效。默认补丁面扩大1.1a1 起patch_all默认补丁subprocessissue 4461.1a2 起在 Python 3.4 上从patch_all/patch_select补丁selectors模块issue 591。其他修复1.1b3 修复 Python 2 上安装了future库时patch_builtins抛AttributeError的问题1.1b2 修复某些 PyPy 版本如 64 位 Linux 上的 2.6.0启用patch_builtins导致崩溃的问题。4. 子进程与信号fork_and_watch、waitpid 与 SIGCHLD 协作机制这是 1.1 系列最有分量的架构级改动从 1.1b1 延续到 1.1b51.1b1libev 的 child watcher 基于 POSIX 信号导致os.waitpid变得不可靠在gevent.subprocess与multiprocessing混用时尤其明显issue 600、452。为此monkey-patched 的os模块开始提供gevent.os.waitpid配合新增的gevent.os.fork_and_watchissue 600协作等待子进程。fork_and_watch在 src/gevent/os.py 中的 docstring 标注versionadded:: 1.1b1父进程 fork 后为该 pid 注册 child watcher子进程侧自动调用gevent.hub.reinit完成事件循环重建。1.1b4gevent.signal.signal注册的SIGCHLD处理器与默认启用的 child watcher 协同工作gevent.os.waitpid支持第一个参数为 -1同样适用于 monkey-patch 后的标准库函数解决 gunicorn 用户的反馈。1.1b5os.forkpty与pty.forkmonkey-patch 后返回的 pid 同样支持SIGCHLD与waitpidissue 650。新增的forkpty_and_watch在 src/gevent/os.py 中标注versionadded:: 1.1b5。1.1rc2gevent.signal.signal现在允许在进程层面重置SIG_DFL或忽略SIG_IGNSIGCHLD文档同时提醒这可能与 libev child watcher 产生竞态issue 696。当前源码中monkey-patch 后的os.fork默认就是fork_and_watch的包装src/gevent/os.py并可通过GEVENT_NOWAITPID环境变量关闭自动监视。回归测试见 src/gevent/tests/test__os.py历史 issue 对应 src/gevent/tests/test__issue600.py。5. Event / AsyncResult竞态修复、唤醒顺序与内存优化1.1.0 修复了gevent.event.Event中的一个著名竞态与 Python 官方 bug 13502 相同当同一个 greenlet先set()再clear()事件时之前已进入等待队列的 greenlet 尚未切换执行wait可能错误返回False。修复后的逻辑直接体现在 src/gevent/event.py 的_wait_return_value中代码注释明确引用http://bugs.python.org/issue13502def _wait_return_value(self, waited, wait_success): # To avoid the race condition outlined in http://bugs.python.org/issue13502, # if we had to wait, then we need to return whether or not # the condition got changed. Otherwise we simply echo # the current state of the flag (which should be true) if not waited: flag self._flag assert flag, if we didnt wait we should already be set return flag return wait_success同版本还规定Event与AsyncResult唤醒等待 greenlet 的顺序统一为未指定顺序此前AsyncResult倾向于 FIFO 但从未承诺并降低了两者的单实例内存占用。1.1.1 进一步修复嵌套回调中set 又 clear导致wait提前返回的问题issue 771。6. Socket 与 SSLsendall 超时、主机名校验与标准库对齐1.1 系列对 socket/SSL 层做了大量向标准库对齐的修复6.1 sendall 的超时语义1.1rc2Python 2 下sendall在某些情况下完全忽略超时修复后sendall的超时指整个发送过程的总耗时。1.1.2Python 2 下非阻塞 socket 的sendall可能误报超时失败。1.1rc5带超时的 gevent SSL socket 调用sendall发送空数据时应像标准库一样立即返回而不是抛ssl.SSLEOFError但用send发送空数据时两者gevent 与标准库都会抛SSLEOFErrorissue 719。1.1rc2SSLsendall发送大缓冲区时不再偶发SSL3_WRITE_PENDINGissue 317。6.2 异常类型与接口对齐1.1rc2gevent 的 SSL socket 异常与标准库一致例如 Python 3 下抛socket.timeout而非ssl.SSLError。1.1rc4Python 2.7.9或具备 PEP 466 SSL 接口时执行与标准库相同的主机名校验此前被跳过对已关闭的SSLSocket读写/握手抛与标准库一致的ValueError而非AttributeErrorissue 735。Python 3 侧修复unwrap与 SNI 回调并正确校验 SSL 主机名。接口补充Python 3 新增sendmsg/recvmsg/recvmsg_into1.1.1PR 773、sendfile、get_inheritable/set_inheritable1.1rc4Python 3.4。其他1.1a2 起sendall支持任意实现 buffer 协议的对象如 ctypes 结构1.1b3 修复gevent.socket.wait可能的TypeError并让sendto正确遵守阻塞状态可能抛EWOULDBLOCK1.1b3 修复 PyPy 上gevent.idle()的TypeError。6.3 阻塞修复1.1a2 修复非 monkey-patch 环境下Python 2.7.9 或 Python 3使用 gevent SSL socket 可能阻塞 greenlet 的问题issue 597。7. Queue、Channel 与同步原语顺序、len 与原子性1.1b3gevent.queue.Queue现在一致地按到达顺序唤醒多个阻塞的put/get调用者此前 CPython 下大致有序、PyPy 下无序并新增对len()的支持issue 643 修复空队列peek抛AttributeErrorissue 647 修复peek可能的ValueError。当前源码中 src/gevent/queue.py 的__len__标注versionadded: 1.1b3_peek直接返回queue[0]src/gevent/queue.py。1.1.1Python 3 下gevent.queue.Channel现在可正确迭代此前抛TypeError。1.1b3Pool.imap_unordered类方法新增maxsize参数限制为消费者缓冲的结果数量issue 638。1.1b1gevent.lock.Semaphore在 PyPy 上与 CPython 一样原子化小幅牺牲性能。1.1rc3 因 Cython 与 PyPy GC 的交互问题影响requests、urllib3在__del__中使用 Semaphore 的场景issue 704Semaphore 在 PyPy 上不再由 Cython 编译改为可追踪但非严格原子的实现语义保持一致。1.1b6 修复 PyPy 上大量分配/释放Semaphore子类的内存泄漏并恢复对gevent.lock.Semaphore精确实例的弱引用支持1.1b1 原子化时意外移除issue 666。1.1b2gevent.kill在目标 greenlet 中抛出正确异常issue 6231.1a2 起killall接受任意可迭代对象issue 404且在 greenlet 真正启动前 kill 可彻底阻止其运行issue 330对应回归测试 src/gevent/tests/test__issue330.py。1.1a1iwait新增count参数PR 482joinall修复raise_errorFalse时忽略count的问题PR 5121.1a2 修复iwait在返回值之间切换 greenlet 时抛LoopExitissue 467回归测试 src/gevent/tests/test__issue467.py。1.1a1JoinableQueue.join新增timeout参数并返回是否全部消费完毕JoinableQueue.__init__传入的 items 视为未完成任务。1.1b1gevent.thread.allocate_lock含 monkey-patch 后的标准库锁对齐内建语义未加锁的锁不能被释放过度释放抛正确异常Python 2 为thread.errorPython 3 为RuntimeError此前是被静默忽略issue 308。8. pywsgi 与 WSGI 服务器编码、健壮性与开销PATH_INFO 解码1.1rc3 起WSGI 的PATH_INFO从 URL 转义解码使用latin-1而非 UTF-8PR 712更贴合 PEP 3333改善了与 Django 等框架的兼容性。start_response 编码检测1.1b5 起WSGIServer/WSGIHandler能更好地检测并报告 header 与状态行的潜在编码错误。自 1.1a1 起 Python 2 下uabc这种 ASCII 范围内的 unicode 也被拒绝向 PEP 3333 靠拢此前某些编码错误可能导致 gevent 写出畸形 HTTP 响应。1.1a1 明确headers 必须以 latin-1 编码issue 614不再允许非 ISO-8859-1 header。chunked 健壮性1.1b1 起恶意/畸形 chunked transfer encoding 数据返回HTTP 400替代此前的 500 或最坏情况下的服务端挂起issue 229。日志支持1.1b1 起WSGIServer的log与新增的error_log参数接受logging.Logger实例实验性issue 1061.1b6 使其对 Logger 类参数更健壮issue 663并修复 Python 3 下请求日志状态码格式issue 664。1.1.0 修复用 Logger 作为日志流时的多余换行issue 756。降低开销1.1rc4 起BaseServer及其子类含WSGIServer不再为每个请求分配新的闭包降低每请求开销。确定性关闭1.1a1 的兼容性说明指出BaseServer/StreamServer现在确定性地在请求处理器返回后关闭客户端 socket——此前依赖 GC 时机CPython 2 下通常但不必然立即关闭PyPy 下任意时刻CPython 3 下可能产生ResourceWarning。依赖handler 返回后 socket 仍存活的代码需要显式持有引用。其他1.1b4 修复 Python 2 下socket.makefile结果忽略 socket 超时的问题issue 6441.1rc4 修复 Python 2 下 WSGI 输入流readline无 size hint 或大 size hint 时大上传抛OverflowErrorissue 2891.1a1 起 pywsgi 不再为客户端正常断连打印调试信息issue 1361.1b6 允许WSGIHandler子类处理非法 HTTP 请求。9. 平台专项修复Windows、Solaris、PyPy 与 CFFI 后端Windows1.1rc1 完成gevent.subprocess在 Windows/Python 3 上的移植issue 668/6691.1b6 构建 Python 3.5 的 Windows wheelsPR 6651.1.0 修复从 PyPI sdist 安装不再需要预先安装 CythonWindows 上仍优先使用 wheel/exe/msi 二进制格式。Solaris1.1.1 修复 Solaris 10 上的构建issue 777。构建工具链1.1b1 修复setup.py在含空格目录下运行issue 319以及在 OS X 新版 clang 下构建严格区分 CFLAGS/CPPFLAGS的问题1.1b1 修复 64 位平台上配置 32 位 Python 的 c-aresissue 381。PyPy 稳定性1.1rc1 修复 PyPy 崩溃issue 676但文档明确提醒仍有少量罕见的 PyPy 崩溃根因未知gevent/CFFI/greenlet/PyPy GC 皆有可能号召用户跟踪 issue 6771.1rc1 修复 hub 回调抛异常时的行为与 CPython 一致打印异常后继续处理其余回调1.1rc1 修复同线程销毁带活动 watcher 的 Hub 后再重建destroy_loopTrue导致的进程崩溃issue 2371.1b1 允许 PyPy 下向 io 回调传递事件PR 604。CFFI 后端1.1rc2 起 CFFI 后端可在 CPythonWindows 除外上构建使用前提是安装 gevent 前已安装cffi设置环境变量GEVENT_CORE_CFFI_ONLY可强制使用 CFFI 后端便于调试并保证各平台行为对齐。该版本还让 CFFI 后端与 Cython 后端行为一致args为None时照常调用 watcher 回调且只允许args为 tuple 或None修复 PyPy/CFFI 下 stat watcher 的潜在崩溃并按sys.getfilesystemencoding编码 unicode 路径。PyPy 资源1.1rc3 优化 CFFI 后端内存每个 watcher 两个指针1.1b3 修复 CFFI 模块编译时机问题并显著提升 PyPy 上sendall大输入性能bench_sendall.py从约 60MB/s 提升至约 630MB/s约 10 倍见仓库 benchmarks/bench_sendall.py。10. 内部实现调整模块移除与线程/IO 层重构移除内部模块1.1rc2 移除了gevent._fileobject2、gevent._fileobject3与gevent._util这些模块自 1.1b1 起就不再被使用或测试。FileObject1.1b1 起 Python 2 的FileObjectPosix改用io包实现与 Python 3 实现统一修复seek()相关问题FileObjectThread通过线程池关闭底层文件对象issue 2011.1b2 为FileObjectPosix增加readable()/writable()修复 monkey-patch 后 Python 3help()等场景。线程/日志1.1b1 让 logging 模块级锁与各 handler 的实例锁在 monkey-patch 后对 greenlet 友好使先 import 再 patch_all或先 basicConfig 再 patch_all更安全修复 Python 3 下threading.RLock的 monkey-patch1.1b6 让 monkey-patch 环境下新 greenlet 里调用threading.current_thread()产生的_DummyThread更轻量不再分配又删除 Semaphore。1.1.0 的 RLock 语义monkey-patch 后的threading.RLock.acquire在使用标准库默认 timeout-1与 gevent 默认 None 不同时正确阻塞/死锁并对非法参数抛与标准库一致的ValueErrorissue 750。导入与阻塞1.1a1 修复多 greenlet 同时导入顶层使用 gevent 阻塞函数的模块时Python 2不再产生导入错误issue 1081.1b5 修复 Python 2 monkey-patch 后模块顶层阻塞操作抛LoopExit的问题issue 651/652虽不推荐但仍需兼容1.1.1 修复 Python 2reload(site)在导入 gevent 后抛TypeErrorissue 805。spawn 系列1.1b1 起spawn/spawn_raw/spawn_later及Greenlet构造函数对不可调用对象立即抛有用的TypeError此前首次切换才报错issue 1191.1rc2 起spawn_raw接受关键字参数issue 6801.1rc4 修复 Python 2 多 greenlet 导入时使用阻塞 API 导致LoopExitissue 728。线程池与 fork1.1a2 修复 fork 子进程如multiprocessing.Process中默认线程池与默认线程解析器挂起的问题issue 230回归测试 src/gevent/tests/test__issue230.py1.1a2 起ThreadPool.imap/imap_unordered接受多个可迭代对象apply传播原始异常并废弃未文档化的apply_eissue 5561.1b1 修复ThreadPool.apply递归使用抛LoopExitissue 131。调试与覆盖1.1b4 在-O/PYTHONOPTIMIZE下仍能检测几类重要编程错误1.1b5 起测试覆盖率上报至 coveralls.io。11. 升级实战建议从 1.0 迁移到 1.1 的检查清单综合上述变更从 gevent 1.0.x 升级到 1.1 时应重点检查Python 版本下限确认运行环境为 Python 2.61.1 起不再支持 2.5PyPy 用户需升级到 2.6.1推荐 4.0.1。monkey-patch 调用不要以不同参数多次调用patch_all避免osFalse与signalTrue的组合否则SIGCHLD与os.waitpid配合 subprocess可能失效。子进程代码monkey-patch 后os.fork默认走fork_and_watch可用GEVENT_NOWAITPID关闭forkpty/pty.fork同样受支持waitpid支持 pid-1。依赖原始os.fork时通过gevent.monkey.get_original获取。服务器行为StreamServer/WSGIServer的 handler 返回后客户端 socket 会被确定性关闭header 必须可 latin-1 编码start_response会抛UnicodeErrorPATH_INFO现在按 latin-1 解码。同步原语语义Event/AsyncResult的唤醒顺序不再保证 FIFOQueue现在支持len()且多等待者严格按到达顺序唤醒Channel在 Python 3 可迭代。SSL 行为Python 3 下 SSL socket 抛socket.timeout而非ssl.SSLErrorPython 2.7.9 执行标准库同级的主机名校验sendall发空数据立即返回。调试手段需要排查核心事件循环问题时可设置GEVENT_CORE_CFFI_ONLY1强制使用 CFFI 后端辅助对比调试。这些变更均有对应的回归测试沉淀在 src/gevent/tests如test__issue600.py、test__issue330.py、test__issue467.py、test__os.py中的fork_and_watch用例升级前可运行测试套件验证行为符合预期。对后续版本感兴趣的读者可继续阅读 docs/changelog_1_2.rst 与 docs/changelog_1_3.rst 了解 1.2、1.3 的演进。赞分享后端【免费下载链接】geventCoroutine-based concurrency library for Python项目地址https://gitcode.com/gh_mirrors/ge/gevent点击查看免费下载相关推荐Sphinx 1.1 版本深度解析Python 3 支持、Texinfo 构建器与多语言全文搜索的里程碑演进Sphinx 1.1 版本深度解析Python 3 支持、Texinfo 构建器与多语言全文搜索的里程碑演进 Sphinx 1.1 是该项目发展史上的一个关键文档开发工具gevent 1.3 版本演进全解析配置系统、监控调试体系与性能优化gevent 1.3 版本演进全解析配置系统、监控调试体系与性能优化 gevent 1.3 系列2018 年 1 月至 10 月从 1.3a1 到 1.3后端PyInstaller 3.x 版本演进全解析从 Python 3 首支持到 2.7 收官的安全与构建变革PyInstaller 3.x 版本演进全解析从 Python 3 首支持到 2.7 收官的安全与构建变革 PyInstaller 3.x 系列3.0–3.开发工具构建工具上一篇突破C性能瓶颈Drogon框架Reactor模式与事件循环深度解析下一篇redux-persist开发工具推荐提升持久化Redux应用开发效率创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?