【问题标题】:In a gevent application, how can I kill all greenlets that have been started?在 gevent 应用程序中,如何杀死所有已启动的 greenlet?
【发布时间】:2013-11-05 02:16:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我们需要更多关于您实施 greenlets 的详细信息。你在使用游泳池吗?也许gevent.shutdown() 适合你?
  • 大多数模块会简单地使用gevent.spawn(),但有些可能会使用池或任何他们喜欢的东西。此外,在 1.0.0 中没有 gevent.shutdown(),即使有,它也不能从非主 greenlet 运行,并且信号处理程序很可能以不同的方式结束。

标签: python gevent


【解决方案1】:

根据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)])

【讨论】:

    【解决方案2】:

    这对于我正在使用的 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-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多