Джанго аккорд сельдерея не исполняется

У меня есть программа, которая генерирует большой список продуктов через itertools Python; в основном большой набор различных комбинаций слов. Есть несколько наборов для запуска через функцию products(). Что я хотел бы сделать, так это попросить Celery помочь с этим, предоставив каждому набору отдельную задачу Celery, а затем объединить их в конце. Насколько я понимаю, аккорды это способ сделать это.

По сути, у меня есть это:

callback = tabulate_results.subtask()
header = []
for combo in combos_to_run:
    header.append(run_product.subtask(args=(object_terms, combo)))
result = chord(header)(callback)
result.get()

И две его поддерживающие, урезанные функции:

from celery import subtask, chord
@task()
def run_product(object_list, combo_set):
    results = []
    for result in product(object_list, *combo_set):
        results.append(result)
    return results

@task()
def tabulate_results(result_sets):
    master_set = []
    for result_set in result_sets:
        master_set.extend(result_set)

    return master_set

Вначале задача аккордов обнаруживалась у сельдереев, но у меня была проблема, о которой здесь говорится: Django Celery - что-то упущено, но я понятия не имею, что? Получите результаты, но не сможете получить информацию о том, что Celery возвращает ошибку, связанную с отслеживанием результатов через MySQL. Я действительно использовал MySQL для моего бэкэнда результата, и переключив его на Redis избавился от него. Однако теперь у меня возникла новая проблема. Когда я запускаю код через оболочку Django, в celeryev не появляется никаких задач, и ничего не возвращается после этого:

R IS: <GroupResult: 9f658e8d-591f-4fa9-9e79-4db0c51e8331 [9b199d1e-061f-413c-9521-4a3051dd121a, 2effbfb5-c9dc-4569-a63f-656c233a9387, 80911a60-6a22-46bb-83a1-d5a84c659794, 70acfa43-8ffe-4bc8-8ff1-1df6def035e1, dd417423-d1f6-44eb-8c4b-2ded40d7614f, fbff8adc-815d-459c-b914-b30528dbbd39]>

В основном сообщение сельдерея, но без данных. Код также никогда не возвращается, и мой курсор остается висеть. Когда я контролирую C, номер строки в Сельдере выглядит как ожидающий. Я понятия не имею, что, хотя, так как сельдериев не дает мне задачи. Я подтвердил, что другие задания показывают в сельдереев.

Я нормально проверил свои функции, не выполняя их как задачи Celery, и они возвращаются нормально.

КОРОТКАЯ ВЕРСИЯ Я пытаюсь заставить аккорды сельдерея помочь с интенсивной задачей Python в моем приложении Django, но они, похоже, не возвращают никакого результата или не попадают в celeryev. Редис бэкэнд. Сельдерей версия 3.0.15. Джанго 1.4.

1 ответ

Во-первых, обычно считается плохой практикой заставлять одну задачу ждать результата другой (поэтому следует использовать цепочечные подзадачи)- источник

Кроме того, синтаксис, который вы вставили для своего аккорда, неверен. Вот соответствующая ссылка: http://docs.celeryproject.org/en/master/getting-started/next-steps.html. Помимо прочего, ваш код не передает никаких аккордов. Аккорд - это просто группа задач, которые обрабатываются как группа, после чего выполняется обратный вызов. Из документации, вот правильный синтаксис для аккорда:

>>> from celery import chord
>>> from proj.tasks import add, xsum

>>> chord((add.s(i, i) for i in xrange(10)), xsum.s())().get()
90

Обратите внимание, что аккорд принимает два аргумента: группу начальных задач, с одной стороны, и обратный вызов (разделенный запятой), с другой.

Это начало, но похоже, что больше времени, проведенного с документацией, поможет вам больше всего.

Другие вопросы по тегам