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

2024-06-16 11:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

(我在raspbian的python2.7上使用gevent 1.0.0)


Tags: 模块of应用程序列表情况geventgreenlet形式
2条回答

根据another SO answer,有可能“遍历堆上的所有对象并搜索greenlets”。因此,我认为这应该是可行的:

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

这在我使用的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)]
)

相关问题 更多 >