我刚刚在Django项目中开始使用芹菜,并且有点坚持这个特殊问题:基本上,我需要将长期运行的任务分配给不同的工作人员。该任务实际上分为几个步骤,每个步骤都需要相当长的时间才能完成。因此,如果某个步骤失败,我希望芹菜使用同一个工作人员重试此任务,以重用已完成步骤的结果。我知道芹菜使用路由将任务分配给某个服务器,但我找不到任何关于这个特定问题的信息。我使用RabbitMQ作为我的经纪人。
答案 0 :(得分:11)
您可以让每个celeryd实例都使用以worker名称命名的队列消耗:
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)