2012-01-06 66 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