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


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

如果我有一个所有正在运行的greenlets,我能做到 gevent.killall(list_of_greenlets)但保持这样的清单是一件麻烦事;此外,gevent必须以某种形式保留这个列表。

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

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


4438
2017-11-05 02:16


起源

我们需要有关greenlet实现的更多详细信息。你在使用游泳池吗?也许 gevent.shutdown() 适合你吗? - dorvak
大多数模块都会使用简单 gevent.spawn(),但有些人可能正在使用游泳池或他们喜欢的任何东西。而且,没有 gevent.shutdown() 在1.0.0中,即使有,它也不能从非主要的greenlet运行,并且信号处理程序很可能最终在另一个。 - squirrel


答案:


根据 另一个答案,它可以“遍历堆上的所有对象并搜索greenlet。”所以,我想这应该工作:

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

15
2017-11-17 04:22





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

0
2018-03-14 15:30