У меня есть ситуация, аналогичная описанной здесь, за исключением того, что вместо цепочки задач с несколькими аргументами я хочу связать задачи, которые возвращают словарь с несколькими записями,
Это - очень свободно и абстрактно --- что я пытаюсь сделать:
tasks.py
@task()
def task1(item1=None, item2=None):
item3 = #do some stuff with item1 and item2 to yield item3
return_object = dict(item1=item1, item2=item2, item3=item3)
return return_object
def task2(item1=None, item2=None, item3=None):
item4 = #do something with item1, item2, item3 to yield item4
return_object = dict(item1=item1, item2=item2, item3=item3, item4=item4)
return return_object
Работа с ipython, я могу вызвать task1 индивидуально и асинхронно, без проблем.
Я также могу вызвать task2 отдельно с результатом, возвращаемым task1 в качестве аргумента с двойной звездой:
>>res1 = task1.s(item1=something, item2=something_else).apply_async()
>>res1.status
'SUCCESS'
>>res2 = task2.s(**res1.result).apply_async()
>>res2.status
'SUCCESS
Однако то, что я в конечном итоге хочу достичь, это тот же конечный результат, что и выше, но через цепочку, и здесь я не могу понять, как создать экземпляр task2 не с (позиционными) аргументами, возвращаемыми task1, а с task1.result как ** kwargs:
chain_result = (task1.s(item1=something, item2=something_else) | task2.s()).apply_async() #THIS DOESN'T WORK!
Я подозреваю, что могу вернуться и переписать свои задачи так, чтобы они возвращали позиционные аргументы вместо словаря, и это может прояснить ситуацию, но мне кажется, что должен быть какой-то способ доступа к возвращенному объекту task1 в task2 с эквивалентной функциональностью ** двойной звезды. Я также подозреваю, что я пропустил кое-что здесь довольно очевидное о реализации подзадачи Celery или * args vs. ** kwargs.
Надеюсь, это имеет смысл. И спасибо заранее за любые советы.