У меня есть ситуация, аналогичная ситуации, описанной в here, за исключением того, что вместо цепочки задач с несколькими аргументами я хочу сгруппировать задачи, которые возвращают словарь с несколькими записями.Целевая цепочка сельдерея и доступ к ** kwargs
Это - очень слабо и абстрактно --- то, что я пытаюсь сделать:
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!
Я подозреваю, что я могу вернуться и переписать мои задачи так, чтобы t hey возвращает позиционные аргументы вместо словаря, и это может прояснить ситуацию, но мне кажется, что должен быть какой-то способ доступа к возвращенному объекту task1 в task2 с эквивалентной функциональностью ** двойной звезды. Я также подозреваю, что я пропустил кое-что здесь достаточно очевидным в отношении реализации подзадачи Celery или * args vs. ** kwargs.
Надеюсь, что это имеет смысл. И спасибо заранее за любые советы.
Понял. Благодарю. Я в конечном итоге решил это, слегка изменив входные/выходные данные в свою задачу. T2 теперь просто ищет один объект dict в качестве входа, а затем извлекает ожидаемые пары k/value из dict для выполнения задачи. –
@BenjaminWhite я до сих пор не понимаю. можете ли вы рассказать мне, как вы это делали? – ashim888