我遇到了一种情况,由于低质量的 C/C++ 依赖,我的工作人员时常被 SIGSEGV 杀死。在这些情况下,我需要知道哪些任务失败了。有没有办法对产生的 WorkerLostError 使用react并了解哪个任务(例如通过 taks_id)导致 worker 丢失?还有其他方法可以实现某些任务由于 SIGSEGV 而失败吗?
谢谢
最佳答案
我找到了适合我的解决方案。首先,我将任务设置为 acks_late=True,允许在未完成时重试。但是,celery 故意避免在出现段错误后重试,以防止无限消息循环。我使用 task_reject_on_worker_lost=True
禁用了此功能。现在,在出现段错误之后,任务将使用相同的 task_id
再次运行,我可以检测到第二次运行时任务会正确失败。
另一个没有危险的 task_reject_on_worker_lost=True
的解决方案是自定义请求和任务类 ( celery docs )。 on_failure
在工作线程主线程中运行,并将在发生 WorkerLostError
时调用。任务 self 上的 on_failure
回调(由丢失的子进程调用)将不会被调用。
关于python - 在 SIGSEGV 之后处理 celery 中的 WorkerLostError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54693518/