Сельдерей: цепочка задач с несколькими аргументами

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

Пример:

@task()
def get_comments(url):
    #get the comments and the submission and return them as 2 objects
    return comments, submission

@task
def render_template(threadComments, submission):
    #render the objects into a html file
    #does not return anything

Теперь, если я вызову их в цепочке типа (get_comments(url) | render_template()). Apply_asnc() python выдаст TypeError: render_template() takes exactly 2 arguments (0 given),

Я вижу, что результаты не развернуты и применяются к аргументам. Если я только вызываю get_comments, я могу сделать:

result = get_comments(url)
arg1, arg2 = result

и получите оба результата.

1 ответ

Решение

Здесь есть две ошибки.

Во-первых, вам не нужно звонить get_comments() а также render_template(), Вместо этого вы должны использовать .s() метод задачи. Подобно:

( get_comments.s(url) | render_template.s()).apply_async()

В вашем случае вы сначала запускаете функцию, а затем пытаетесь объединить результаты функций в цепочку.

Во-вторых, на самом деле, вы не возвращаете "два результата" из вашего первого задания. Вместо этого вы возвращаете кортеж, содержащий оба результата, и этот кортеж передается второй задаче как отдельный объект.

Поэтому вам следует переписать вашу вторую задачу как

@task
def render_template(comments_and_submission):
   comments, submission = comments_and_submission

Если вы исправите это, оно должно работать.

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