Eventlet 超时不退出

Eventlet timeout not exiting

为什么 eventlet 允许它完成 6 秒,而它应该在 5 秒后退出缩进?

>>> with eventlet.Timeout(5):
        time.sleep(6)
        x = 1
>>> x
1

Eventlet 提供协作式多线程。这意味着您需要让出控制权,让集线器或协程(在这种情况下,集线器实现超时)有机会 运行。产量控制:

  • 要么使用绿色版本的IO,要么休眠
  • 或执行eventlet.monkey_patch(),现在可以使用常规timesocket等模块,替换为"green"版本,配合Eventlet。

任何 CPU 没有绿色调用的紧凑代码,例如 [_ for _ in xrange(1000000000)] 根本不可能被中断。如果您发现自己处于类似情况,请将 eventlet.sleep(0) 放在循环中的某处,这将进入 Eventlet 中心并允许超时工作。