如何处理python导入模块中c++断言导致的Celery WorkerLostError

How to handle Celery WorkerLostError due to c++ assertion in python imported module?

本文关键字:断言 c++ WorkerLostError Celery 模块 何处理 处理 导入 python      更新时间:2023-10-16

我有一个python模块,其中包含使用pybind11的c++代码,我已在django+celecer3.1.25应用程序中导入该代码。c++代码包含一些断言,这些断言可能会在芹菜工作者内部触发,然后导致WorkerLostError

我已经尝试将对pythonC++模块的调用放在try:except:作用域内,但是这不起作用,并且芹菜工作程序仍然崩溃。

我还尝试使用apply_async调用中的link_error=参数将错误回调函数绑定到芹菜任务,但该方法从未被调用。

理想情况下,我希望以某种方式捕捉错误,以便向用户显示错误消息。欢迎提出任何建议!

我通常要处理Celery任务中C++二进制文件的执行,就是使用子流程模块,尤其是子流程。运行。您将获得执行命令产生的结果代码(rc)和标准输出/错误,而不会使工作进程崩溃(WorkerLost)。最多,通过调用subprocess.run,您将不得不处理异常,这些异常是根据关键字参数check的值在非零rc上引发的:

如果check为true,并且进程以非零退出代码退出,则将引发CalledProcessError异常。其属性异常包含参数、退出代码、stdout和stderr,如果他们被俘虏了。

但是,我通常更喜欢禁用它,并自己检查返回代码。

我已经广泛使用这种方法来处理预期和意外的返回代码,以及由内存泄漏、segfault等产生的操作系统信号(rc<0)。

为了处理和格式化操作系统信号,我使用信号模块。