在 gevent 中处理 Thread/Greenlit kill

Handle Thread/Greenlit kill in gevent

我想在 gevent 中创建一个非阻塞的 thread/Greenlit。该线程旨在 运行 直到发送某种信号来停止它,此时我希望执行一个操作(保存一些数据)。

来自 gevent kill docs 我希望以下代码在被杀死时打印 Done

import gevent
def myloop():
    try:
        while True:
            pass
    except gevent.greenlet.GreenletExit:
        print "Done"
thread = gevent.spawn(myloop)
thread.kill()

然而,这并没有发生。关于为什么的任何想法?我做错了什么可怕的事吗?我怎样才能达到指定的行为?

由于您的 greenlet 实际上从未 "blocking",而是永远消耗 CPU,因此它从未被杀死。从 gevent 的角度来看,它会被杀死,但这永远不会发生,因为 greenlet 永远不会离开它的 while 循环。

我很确定,如果您在 while 循环中添加 sleep(0)sleep 将引发 GreenletExit 并且循环将中断。

事实上,您可以通过查看您的代码来推断这一点:

try:
    while True:
        pass
except ...:
    ...

从语法上讲,这里没有任何可以引发异常的内容。我们需要做一些可以筹集的事情,那就是sleep(0)