2012-01-06 71 views
6

我刚刚在一个Django项目中开始使用芹菜,并且有点卡住了这个特殊问题:基本上,我需要将一个长期运行的任务分配给不同的工作人员。该任务实际上分为几个步骤,每个步骤都需要相当长的时间才能完成。因此,如果某个步骤失败了,我希望芹菜使用同一个工作人员重试此任务,以重新使用已完成步骤的结果。我知道芹菜使用路由将任务分配给某个服务器,但我无法找到有关此特定问题的任何信息。我使用RabbitMQ作为我的经纪人。如何使用相同的工人使芹菜重试?

回答

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) 
+0

非常感谢您的回答!我认为这正是我正在寻找的。我没有意识到,我们可以通过队列名称重试(),但现在它使很多意义:) – dangmai 2012-01-07 03:29:43

+0

'celeryd'现在被弃用,使用'芹菜工人'。 – user 2013-11-18 10:05:12

+0

在windows上使用'%computername%'和在linux上使用'\'hostname \''来构建命令行。 – ubershmekel 2014-07-08 15:38:38