Поведение холста сельдерея отличается между асинхронным и нетерпеливым режимом - PullRequest
1 голос
/ 11 июля 2019

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

Ну, это кажется сложным, позвольте мне показать пример:

Дано следующее задание:

@shared_task(bind=True)
def grouped(self, val):
    task = (
        group(asum.s(val, n) for n in range(val)) | asum.s(val)
    )
    raise self.replace(task)

когда оно сгруппировано на другом холсте, как это:

@shared_task(bind=True)
def flow(self, val):
    workflow = (asum.s(1, val) |
                asum.s(2) |
                grouped.s() |
                amul.s(3))

    return self.replace(workflow)

задание amul не будет получать результаты от сгруппированных в активном режиме.

Чтобы по-настоящему проиллюстрировать проблему, я создал пример проекта на github, где вы можете погрузиться в проблему и помочь мне с некоторыми быстрыми решениями и, возможно, с некоторыми пиарщиками в проекте по сельдерею.

https://github.com/gutomaia/celery_equation

---- отредактировано ----

В проекте я заявляю о различном поведении обоих способов использования сельдерея. В асинхронном режиме эти задачи работают должным образом.

>>> from equation.main import *
>>> from equation.tasks import *
>>> flow.delay(1).get()
78
>>> flow.delay(2).get()
120
>>> flow.delay(100).get()
47895

Ответы [ 2 ]

1 голос
/ 12 июля 2019

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

0 голосов
/ 12 июля 2019

grouped () ничего не возвращает, так как вы ожидаете, что amul получит результат ??

...