Gevent指南

Notes

greenlet 具有确定性. 在相同配置相同输入的情况下, 它们总是会产生相同的输出.

即使 gevent 通常带有确定性, 当开始与 socket 或文件等外部服务交互时, 不确定性也可能溜进你的程序中. 当两个并发线程/进程都依赖于某个共享资源同时都去尝试修改它的时候, 就会出现竞争条件. 这会导致资源修改的结果依赖于时间和执行顺序.

当主程序收到一个 SIGQUIT 信号时, 不能成功做 yield 操作的 Greenlet 可能会意外地挂起程序的执行. 这导致了所谓的僵尸进程, 它需要在 Python 解释器之外被 kill 掉. 对此, 一些通用的处理模式就是在主程序中监听 SIGQUIT 信号, 在程序退出时调用 gevent.shutdown.

Pool 是一个为处理数量变化并且需要限制并发的 greenlet 而设计的结构. 在需要并行地做很多受限于网络和IO的任务时常需要用到它. 当构造 gevent 驱动的服务时, 整个服务经常围绕一个 Pool 结构.

Gevent 允许你指定局部于 greenlet 上下文的数据. 在内部, 它被实现为以 greenlet 的 getcurrent() 为键, 在一个私有命名空间寻址的全局查找. 很多集成了 gevent 的 web 框架将 HTTP 会话对象以线程局部变量的方式存储在 gevent 内.

gevent.subprocess supports cooperative waiting on subprocesses.