在SIGSEGV之后处理芹菜中的WorkerLostError

时间:2019-02-14 15:11:07

标签: python celery

我遇到的情况是,由于对C / C ++的依赖性较低,我的工人有时会被SIGSEGV杀死。在这些情况下,我需要知道哪些任务失败了。有什么办法可以应对由此产生的WorkerLostError并了解哪个任务(例如taks_id)导致了工作人员流失?还有其他方法可以意识到某些任务由于SIGSEGV而失败了?

Thx

1 个答案:

答案 0 :(得分:0)

我找到了适合我的解决方案。首先,我将任务设置为acks_late=True,以便在未完成时重试它们。但是,芹菜故意避免在出现段错误后重试,以防止无限消息循环。我使用task_reject_on_worker_lost=True禁用了此功能。现在,在出现段错误之后,该任务将使用相同的task_id重新运行,并且我可以检测到第二次运行正确地使任务失败。

另一个没有危险task_reject_on_worker_lost=True的解决方案是自定义请求和任务类(celery docs)。 on_failure在worker主线程中运行,并将在WorkerLostError上调用。任务上的on_failure回调是self(由丢失的孩子调用),将不会被调用。

相关问题