监视作业中的gevent异常

Ste*_*han 13 python exception-handling gevent

我正在使用gevent构建一个应用程序.我的应用程序现在变得相当大,因为有很多工作正在产生和销毁.现在我注意到,当其中一个作业崩溃时,我的整个应用程序只是继续运行(如果异常来自非主要的greenlet),这很好.但问题是我必须查看我的控制台才能看到错误.所以我的应用程序的某些部分可能会"死",我不会立即意识到这一点并且应用程序会继续运行.

用try catch东西抖动我的应用程序似乎不是一个干净的解决方案.也许是一个自定义的spawn函数,它会做一些错误报告?

监控gevent jobs/greenlets的正确方法是什么?抓住异常?

在我的情况下,我会听取几个不同来源的事件,我应该处理每个不同的事件.有5个工作非常重要.webserver greenlet,websocket greenlet,数据库greenlet,alarm greenlet和zmq greenlet.如果任何"死",我的申请应该完全死亡.其他死亡的工作并不重要.例如,由于引发了一些异常,websocket greenlet可能会死亡,其余的应用程序一直运行良好,就像没有发生任何事情一样.它现在完全无用且危险,应该只是崩溃.

Den*_*nko 12

我认为最干净的方法是捕获你认为致命的异常并做sys.exit()(你需要gevent 1.0,因为之前SystemExit没有退出过程).

另一种方法是使用link_exception,如果greenlet因异常而死亡,则会调用它.

spawn(important_greenlet).link_exception(lambda *args: sys.exit("important_greenlet died"))
Run Code Online (Sandbox Code Playgroud)

请注意,您还需要gevent 1.0才能使用.

如果在0.13.6上,执行类似这样的操作来终止进程:

gevent.get_hub().parent.throw(SystemExit())
Run Code Online (Sandbox Code Playgroud)