我正在使用gevent构建应用程序。我的应用程序现在变得相当大了,因为有很多工作正在生成和销毁。现在我已经注意到,当其中一个作业崩溃时,我的整个应用程序只会继续运行(如果异常来自非主greenlet),这很好。但问题是我必须查看控制台才能看到错误。因此,我的应用程序的某些部分可能会“死亡”,我没有立即意识到这一点,应用程序会继续运行。
用Try-Catch的东西抖动我的应用程序似乎不是一个干净的解决方案。
可能是一个自定义的生成函数,它执行一些错误报告?
监控Gevent工作/Greenlet的正确方法是什么?捕获异常?
在我的例子中,我听一些不同来源的事件,我应该处理每个不同的事件。
有5个工作非常重要。webserver greenlet,websocket greenlet,
数据库greenlet、alarms greenlet和zmq greenlet。如果这些“死亡”中的任何一个,我的申请将完全死亡。其他死亡的工作也没那么重要。例如,websocket greenlet可能会由于引发的某些异常而死亡,而其余的应用程序会保持正常运行,就像什么都没有发生一样。它现在完全没用了,很危险,应该会猛烈地撞击。
最佳答案
我认为最干净的方法是捕获您认为致命的异常并执行sys.exit()
(您需要gevent1.0,因为在此之前SystemExit
没有退出进程)。
另一种方法是使用link_exception,如果greenlet因异常而死亡,则称之为link_exception。
spawn(important_greenlet).link_exception(lambda *args: sys.exit("important_greenlet died"))
请注意,您还需要GEvent 1.0才能工作。
如果在0.13.6上,执行如下操作以终止进程:
gevent.get_hub().parent.throw(SystemExit())