我正在使用 gevent 使用 python 编写的应用程序。由于我没有明确捕获的任何异常,我希望它立即退出。
看来我必须修补核心 gevent 代码。
有什么方法可以在我的应用程序中执行此操作,而无需修补 gevent 或 greenlet?
您使用的是1.0beta 版,然后调整gevent.get_hub().SYSTEM_ERROR
可以帮助您。SYSTEM_ERROR
列出异常类型,如果被 gevent 捕获,应该在主 greenlet 中重新引发。
默认情况下,SYSTEM_ERROR
是(KeyboardInterrupt, SystemExit, SystemError)
. 其他所有未处理的异常都将被报告,但不会结束进程(除非在主greenlet中引发原始异常,在这种情况下通常会发生)。
您可以修改SYSTEM_ERROR:
import gevent
gevent.spawn(int, "xxx").join() # will merely report ValueError on stderr
gevent.get_hub().SYSTEM_ERROR += (ValueError, )
gevent.spawn(int, "xxx").join() # will report ValueError, but then it will also re-raise it
如果设置SYSTEM_ERROR
为BaseException
,则任何未处理的异常都将被视为致命异常。
您可以使用spawn_link_exception
而不是spawn
.