Mam sytuację podobną do tej opisanej here, z tym że zamiast łączyć zadania z wieloma argumentami, chcę łańcuchować zadania, które zwracają słownik z wieloma wpisami.Selerowy łańcuch zadań i uzyskiwanie dostępu ** kwargs
To jest - bardzo luźno i abstrakcyjnie --- co usiłuję zrobić:
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
Praca ipython, jestem w stanie wywołać Zadania1 indywidualnie i asynchronicznie bez problemów.
mogę również zadzwonić task2 indywidualnie z wyniku zwróconego przez Zadania1 jako double-gwiazdkowego argumentu:
>>res1 = task1.s(item1=something, item2=something_else).apply_async()
>>res1.status
'SUCCESS'
>>res2 = task2.s(**res1.result).apply_async()
>>res2.status
'SUCCESS
Jednak to, co ostatecznie chcemy osiągnąć jest taki sam efekt końcowy, jak wyżej, ale za pomocą łańcucha, i tutaj, nie mogę dowiedzieć się, jak mają task2 nie tworzony z (pozycyjnych) argumentów zwróconych przez Zadania1, ale z task1.result jako ** kwargs:
chain_result = (task1.s(item1=something, item2=something_else) | task2.s()).apply_async() #THIS DOESN'T WORK!
podejrzewam, że mogę wrócić i przepisać moje zadania tak, aby t hej zwracają argumenty pozycyjne zamiast słownika, a to może wyjaśnić, ale wydaje mi się, że powinien istnieć jakiś sposób dostępu do obiektu zwracanego task1 w zadaniu 2 z równoważną funkcjonalnością ** podwójnej gwiazdy. Podejrzewam również, że brakuje mi czegoś dość oczywistego na temat implementacji podzadania w Celery lub * args vs. ** kwargs.
Mam nadzieję, że to ma sens. I z góry dziękuję za wszelkie wskazówki.
zrozumiałe. Dzięki. W końcu rozwiązałem to przez nieznaczną zmianę danych wejściowych/zwrotów w moim zadaniu. T2 szuka teraz pojedynczego obiektu dyktowanego jako wejścia, a następnie pobiera oczekiwane pary k/wartości z dyktafonu, aby wykonać zadanie. –
@BenjaminWhite wciąż nie mogę tego zdobyć. możesz mi powiedzieć, jak to zrobiłeś – ashim888