在gevent应用程序中,如何杀死所有已启动的greenlet?

时间:2013-11-05 02:16:32

标签: python gevent

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

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

那么,我可以杀死已经启动的所有greenlet而不维护它们的列表吗?

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

2 个答案:

答案 0 :(得分:15)

根据another SO answer,可能“遍历堆上的所有对象并搜索greenlet。”所以,我想这应该有用:

import gc
import gevent
from greenlet import greenlet    
gevent.killall([obj for obj in gc.get_objects() if isinstance(obj, greenlet)])

答案 1 :(得分:1)

对于我正在使用的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)]
)