Ho una situazione simile a quella delineata here, ad eccezione del fatto che anziché concatenare attività con più argomenti, voglio concatenare attività che restituiscono un dizionario con più voci.Task chain di Celery e accesso ** kwargs
Questo è - in modo molto impreciso e astrattamente --- quello che sto cercando di fare:
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
Lavorare da ipython, sono in grado di chiamare task1 individualmente e in modo asincrono senza problemi
Posso anche chiamare TASK2 individualmente con il risultato restituito da task1 come un argomento stella doppia:
>>res1 = task1.s(item1=something, item2=something_else).apply_async()
>>res1.status
'SUCCESS'
>>res2 = task2.s(**res1.result).apply_async()
>>res2.status
'SUCCESS
Tuttavia, ciò che in ultima analisi, voglio ottenere è lo stesso risultato finale come sopra, ma tramite una catena, e qui, io non riesco a capire come avere TASK2 un'istanza non con (posizionali) argomenti restituiti da task1, ma con task1.result come ** kwargs:
chain_result = (task1.s(item1=something, item2=something_else) | task2.s()).apply_async() #THIS DOESN'T WORK!
ho il sospetto che io possa tornare indietro e riscrivi i miei compiti in modo che t hey restituisce argomenti posizionali invece di un dizionario, e questo può chiarire le cose, ma mi sembra che ci debba essere un modo per accedere all'oggetto restituito di task1 in task2 con la funzionalità equivalente della ** stella doppia. Sospetto anche che mi manchi qualcosa di abbastanza ovvio riguardo all'implementazione della sottotabella di Celery o * args vs ** kwargs.
Spero che questo abbia senso. E grazie in anticipo per eventuali suggerimenti.
Capito. Grazie. Alla fine ho risolto questo problema modificando leggermente gli input/return nel mio task. T2 ora cerca solo un singolo oggetto dict come input, quindi recupera le coppie k/valore attese dal dict per eseguire l'operazione. –
@BenjaminWhite ancora non lo capisco. puoi dirmi come hai fatto questo? – ashim888