13

我有一个 gevent 应用程序,可以跨多个模块生成多个 greenlet。我希望能够优雅地关闭应用程序(例如在内部或通过SIGTERMcatch ),允许 greenlets 通过捕获GreenletExit和执行finally:子句很好地终止。

如果我拥有所有正在运行的 greenlets 中的一个,我可以这样做gevent.killall(list_of_greenlets),但是维护这样一个列表相当麻烦;此外,gevent 必须以某种形式保存这个列表。

那么,我可以在不维护列表的情况下杀死所有已启动的greenlets吗?

(我在 raspbian 上的 python 2.7 上使用 gevent 1.0.0)

4

2 回答 2

18

According to another SO answer, it's possible "to iterate through all the objects on the heap and search for greenlets." So, I imagine this ought to work:

import gc
import gevent
from greenlet import greenlet    
gevent.killall([obj for obj in gc.get_objects() if isinstance(obj, greenlet)])
于 2013-11-17T04:22:58.517 回答
3

这对于我正在使用的 gevent (1.2.2) 和 greenlet (0.4.13) 版本不太适用,但以下是:

import gc
import gevent
gevent.killall(
    [obj for obj in gc.get_objects() if isinstance(obj, gevent.Greenlet)]
)
于 2018-03-14T15:30:19.930 回答