如何让Celery在同一工作进程中重试?

6 投票
1 回答
3246 浏览
提问于 2025-04-17 09:39

我刚开始在Django项目中使用celery,现在遇到了一些问题:简单来说,我需要把一个耗时很长的任务分配给不同的工作者。这个任务实际上分成了几个步骤,每个步骤都需要花费不少时间来完成。因此,如果某个步骤失败了,我希望celery能用同一个工作者重试这个任务,这样就可以重复利用已经完成的步骤的结果。我知道celery是通过路由来把任务分配给特定的服务器,但我找不到关于这个具体问题的任何信息。我使用RabbitMQ作为我的消息代理。

1 个回答

11

你可以让每个 celeryd 实例从一个以工作机器的主机名命名的队列中获取任务:

celeryd -l info -n worker1.example.com  -Q celery,worker1.example.com

这段代码把主机名设置为 worker1.example.com,这样它就会从一个同名的队列中获取任务,同时也会从默认的队列(叫 celery)中获取。

如果你想把一个任务指派给特定的工作机器,可以使用:

task.apply_async(args, kwargs, queue="worker1.example.com")

类似地,如果你想重试一个任务:

task.retry(queue="worker1.example.com")

或者如果你想把重试任务指派给同一台工作机器:

task.retry(queue=task.request.hostname)

撰写回答