celery. Запуск одной задачи последовательно

В проекте описаны методы, которые запускаются как celery task. так: my_function.delay() и выполняются где-то в фоне.
Есть один task из всех тасков, который нужно выполнять только один в определенный момент времени.
Как это сделать?

т.е если task выполняется уже, то следующий (с этим же именем) должен подождать, потом запустится. Остальные задачи пусть продолжают параллельно выполняться друг с другом.
  • Вопрос задан
  • 4581 просмотр
Решения вопроса 1
Почитайто про routing. Надо эти задачи отправить в отдельную очередь и настроить только один воркер, обрабатывающий эту очередь, а в нем разрешить тольо один поток. Это единственный способ, если вы хоите использовать только celery.
Если нужна еще надежность, нужна сторонная реализация многомашинного lock'а, задачу выполнять под ним. Также, как и в первом случае лучше настроить отдельную очередь но уже с несколькими воркерами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@niko83
Если используете uWSGI. Как альтернатива (не гарантирую что всё будет гладко, сам на практике не пробовал), но можно поэксперементировать: отказать от сэлэри и использовать встроенные механизмы uwsgi используя декораторы spool и lock projects.unbit.it/uwsgi/wiki/Decorators. Если решитись попробвать — отпишите о результатах, пожалуйсто, и с какими ограничениями и проблемами столкнулись.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы