2010-12-29 23 views
2
#tasks.py 
from celery.task import Task 
class Randomer(Task): 
    def run(self, **kwargs): 
     #run Randomer again!!! 
     return random.randrange(0,1000000) 


>>> from tasks import Randomer 
>>> r = Randomer() 
>>> r.delay() 

En ce moment, j'exécuter la tâche simple. Et il renvoie un nombre aléatoire. Mais, comment puis-je faire exécuter une autre tâche, à l'intérieur de cette tâche?Dans Celery, comment exécuter une tâche, puis exécuter une autre tâche et la maintenir?

+0

Pourquoi voulez-vous faire? Essayez-vous de mettre en place quelque chose comme un crontab ou un chien de garde? Dans ce cas cette question est une instance du [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) et il serait plus productif poser des questions sur le problème d'origine vous essayez de résoudre au lieu de vous demander comment mettre en œuvre la solution que vous avez conçue. –

Répondre

6

Vous pouvez appeler other_task.delay() à l'intérieur Randomer.run; dans ce cas, vous pouvez définir Randomer.ignore_result = True (et other_task.ignore_result, etc.). Rappelez-vous que les tâches de céleri delay retournent instantanément, donc si vous ne mettez aucune limite ou temps d'attente sur les appels imbriqués (ou appels récursifs), vous pouvez atteindre la fusion assez rapidement.

Au lieu de récursion ou tâches imbriquées, vous devriez envisager une boucle infinie pour éviter tout débordement de la pile (sans jeu de mots).

from celery.task import Task 
class Randomer(Task): 
    def run(self, **kwargs): 
     while True: 
      do_something(**kwargs) 
      time.sleep(600) 
+0

pouvez-vous montrer un exemple de code? Je ne comprends pas ce que vous voulez dire – TIMEX

+0

Mais je veux que do_something soit "Randomer()". Je pourrais y ajouter un délai, afin qu'il ne continue pas sans relâche. Êtes-vous en train de dire que je dois écrire une autre fonction appelée "do_something", qui est identique à la classe aléatoire? – TIMEX

+0

Par "do_something" je veux dire tout ce qui est réel travail Randomers. Si vous voulez que quelque chose continue, vous avez besoin d'une boucle, pas d'une file d'attente; peut-être que je me trompe, c'est difficile à dire à partir de l'échantillon que vous avez posté. Mettre un appel récursif infini à l'intérieur d'une tâche est dangereux, vous pouvez consommer toutes les ressources informatiques assez rapidement (fusion). –

2

Vous pouvez enchaîner les sous-tâches comme décrit ici: http://docs.celeryproject.org/en/latest/userguide/canvas.html#chains

+3

les chaînes sont quelque chose comme, lorsque vous exécutez la première tâche et que vous voulez en faire le résultat dans la deuxième tâche, vous devez enchaîner ces tâches. Mais la question ici est différente. enchaîner c'est comme canaliser un résultat de tâche dans un autre. Je pense que l'intention du questionneur est de résoudre les appels de tâches imbriqués. –

+0

Je suppose que OP veut mettre en œuvre quelque chose comme un crontab ou un chien de garde et une file d'attente de tâches n'est pas la meilleure base pour cela. –

Questions connexes