Сельдерей: цепочка задач с несколькими аргументами
В документации по сельдерею сказано, что если несколько задач связаны друг с другом, то результат первой задачи будет первым аргументом следующей. Моя проблема в том, что я не могу заставить его работать, когда у меня есть задача, которая возвращает несколько результатов.
Пример:
@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
Если вы исправите это, оно должно работать.