Как заставить сельдерей повторить попытку с помощью того же рабочего? - PullRequest
6 голосов
/ 06 января 2012

Я только начинаю с сельдереем в проекте Django, и я как бы застрял в этой конкретной проблеме: в основном, мне нужно распределить долгосрочную задачу среди разных работников.Задача фактически разбита на несколько этапов, каждый из которых занимает значительное время.Поэтому, если какой-то шаг не удался, я бы хотел, чтобы сельдерей повторил эту задачу, используя того же работника, чтобы повторно использовать результаты завершенных шагов.Я понимаю, что сельдерей использует маршрутизацию для распределения задач по определенному серверу, но я не могу найти ничего об этой конкретной проблеме.Я использую RabbitMQ в качестве моего брокера.

1 Ответ

11 голосов
/ 06 января 2012

Вы можете получить каждый экземпляр 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)
...