2013-08-12 16 views
1

J'ai une tâche de céleri appelée send_async_fax et une autre appelée send_notifications. send_async_fax peut être appelé directement. Si vous appelez send_notifications, cependant, send_async_fax sera également appelé.Appel d'une tâche de céleri à partir d'une autre tâche de céleri

send_async_fax a un certain nombre d'arguments dont l'un est une liste d'objets file. Si j'appelle directement send_async_fax, tout semble se passer comme prévu. Cependant, quand il est appelé indirectement, via send_notifications, je trouve que la liste des fichiers ouverts valides se dégrade en une liste de fichiers non initialisés. Mon sentiment était que send_notifications créait en fait des tâches asynchrones distinctes pour l'envoi de fax lorsque send_async_fax.delay était appelée (ce qui, bien sûr, avait du sens). En faisant cela, cependant, je soupçonne que les références de fichiers sont en train de se foirer, ou que send_notifications ferme les fichiers avant que send_async_fax ne puisse fonctionner sur eux.

Pour tester cette intuition, j'ai essayé d'appeler send_async_fax en send_notifications sans utiliser la fonction delay (à savoir, send_async_fax (* args) au lieu de send_async_fax.delay (* args)). Cela n'a rien changé. Ensuite, j'ai commenté le décorateur task pour send_async_fax pour en faire une fonction régulière. Dans ce cas, tout fonctionne comme prévu. Donc, pour que cela fonctionne, la solution évidente est de faire une version synchrone de ma fonction de fax et de l'utiliser, au lieu de la version asynchrone, lors de l'appel d'une tâche de céleri. J'espère cependant qu'il existe une solution plus élégante que celle-ci. Merci de votre aide.

  • céleri == 3.0.19
  • django-céleri == 3.0.17

Répondre

0

Je parie qu'il a quelque chose à voir avec de sérialisation les fichiers ouverts comme arguments pour une tâche retardée.

Essayez d'envoyer les noms de fichiers fullpath en tant que paramètres d'entrée à la fonction send_async_fax et d'ouvrir les fichiers dans send_async_fax.

je mets un exemple ici d'une tâche d'appeler un autre:

https://github.com/brentpayne/django-celery-example/blob/master/polls/tasks.py

https://github.com/brentpayne/django-celery-example/blob/master/polls/management/commands/one_task_calls_another.py

mais vous voudrez peut-être faire quelque chose comme:

groupe

(send_async_fax.map (my_list_to_fax)) .delay()

Questions connexes