2013-02-25 2 views
2

Я разрабатываю веб-приложение с Django, которое использует Celery для обработки асинхронных задач, особенно для транзакционных писем.Django with celery: запланированное задание (ETA), выполняемое несколько раз параллельно

Один из моих заданий электронной почты запланирован с опцией ETA, но он выполняется несколько раз параллельно, что приводит к почтовой цепочке, очень анонимной. Почему я не понимаю. Я дважды проверил свой код Django, и я уверен, что он публикуется только один раз.

Я использую Redis в качестве результата брокера/бэкэнд.

Мой сельдерея демон размещен на Heroku и запущен с помощью этой команды:

python manage.py celeryd -E -B --loglevel=INFO 

Спасибо за вашу помощь.

EDIT: я найти верное решение здесь благодаря парню на #celery IRC канал: http://loose-bits.com/2010/10/distributed-task-locking-in-celery.html

+2

Обязательно прочтите: http://docs.celeryproject.org/ru/latest/getting-started/brokers/redis.html#caveats – asksol

+0

Проблема в том, что я не знаю максимальную ETA в своем приложении. Я всегда публикую их, как только могу, даже в будущем (не так часто). Для этого я должен изменить свой дизайн приложения, сохранить его в БД и получить сканер, чтобы опубликовать их за 1 час до пример .. –

ответ

2

Вы проверили Ensuring a task is only executed one at a time документы?

+2

Спасибо за ваш ответ. Я проверяю подобное решение здесь: http://loose-bits.com/2010/10/distributed-task-locking-in-celery.html, используя Redis. Это, кажется, работает очень хорошо, я настраиваю его немного, потому что мне нужно блокировать другие задачи одного типа и с тем же контекстом. У меня hash задача args, связанная с именем функции задачи как ключ блокировки. Мне также пришлось добавить декоратор оберток из functools, так как я использую функции на основе задач. –

Смежные вопросы