我有一个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)。
为了处理和格式化操作系统信号,我使用信号模块。