Je me trouve dans une situation similaire à celle décrite ici sauf qu'au lieu d'enchaîner des tâches avec plusieurs arguments, je veux enchaîner des tâches qui renvoient un dictionnaire avec plusieurs entrées.
C'est - très vaguement et abstraitement --- ce que j'essaie de faire :
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
En travaillant avec ipython, je suis capable d'appeler la tâche 1 individuellement et de manière asynchrone, sans aucun problème.
Je peux AUSSI appeler la tâche 2 individuellement avec le résultat retourné par la tâche 1 comme argument double :
>>res1 = task1.s(item1=something, item2=something_else).apply_async()
>>res1.status
'SUCCESS'
>>res2 = task2.s(**res1.result).apply_async()
>>res2.status
'SUCCESS
Cependant, ce que je veux obtenir en fin de compte, c'est le même résultat final que ci-dessus, mais via une chaîne, et ici, je n'arrive pas à comprendre comment faire en sorte que la tâche 2 ne soit pas instanciée avec (positional) arguments retourné par task1, mais avec task1.result comme **kwargs :
chain_result = (task1.s(item1=something, item2=something_else) | task2.s()).apply_async() #THIS DOESN'T WORK!
Je pense que je peux revenir en arrière et réécrire mes tâches pour qu'elles renvoient des arguments positionnels au lieu d'un dictionnaire, et cela pourrait clarifier les choses, mais il me semble qu'il devrait y avoir un moyen d'accéder à l'objet de retour de la tâche 1 dans la tâche 2 avec la fonctionnalité équivalente de la **double étoile. Je soupçonne également que j'ai raté quelque chose d'assez évident à propos de l'implémentation des sous-tâches de Celery ou des *args par rapport aux **kwargs.
J'espère que cela a du sens. Et merci d'avance pour tout conseil.