Я использую Django Celery с Redis для запуска нескольких подобных задач:
header = [
tasks.invalidate_user.subtask(args = (user)),
tasks.invalidate_details.subtask(args = (user))
]
callback = tasks.rebuild.subtask()
chord(header)(callback)
Таким образом, в основном то же самое, что указано в документации .
Моя проблема в том, что когда вызывается этот аккорд задачи,celery.chord_unlock
задача постоянно повторяется . Задачи в header
завершаются успешно, но из-за того, что chord_unlock
никогда не выполняется,callback
никогда не вызывается .
Предполагая, что моя проблема заключается в невозможности определить, что задачи из header
завершены, я обратился к документации, чтобы посмотреть, как это можно настроить. Я нашел раздел , описывающий, как реализована синхронизация, есть приведенный пример, чего мне не хватает, так это того, как мне вызвать эту примерную функцию (, т.е. есть ли сигнал для этого? ).
Далее следует отметить, что этот метод не используется с серверной частью Redis.:
Этот метод используется всеми серверными частями результатов, кроме Redis и Memcached, которые увеличивают счетчик после каждой задачи в заголовке, а затем применяют обратный вызов, когда счетчик превышает количество заданий в наборе.
Но также говорится, что подход Redis лучше:
Подход Redis и Memcached — гораздо лучшее решение
Что это за подход? Как это реализовано?
Итак, почему chord_unlock
никогда не выполняется и как мне заставить его обнаруживать завершенные header
задачи?
Я использую :Django 1.4, celery 2.5.3, django -celery 2.5.5, redis 2.4.12