2013-02-15 1 views
6

Y at-il un moyen de mettre en pause/reprendre un flux de travail en cours d'exécution créé en utilisant des chaînes de céleri 3.0?Django Celery Workflow Pause/Resume

Fondamentalement, nous avons deux types de tâches différentes dans notre système: les tâches interactives et non interactives. Les non-interactifs dont nous avons tous les paramètres, mais les interactifs ont besoin de l'intervention de l'utilisateur. Notez que pour les tâches interactives, nous ne pouvons demander une entrée d'utilisateur qu'une fois toutes les tâches précédentes de la chaîne terminées, car leurs résultats affecteront les tâches interactives (nous ne pouvons pas demander d'entrée utilisateur avant de créer la chaîne).

Une suggestion sur la façon d'aborder cela? Vraiment à une perte ici ..

idées actuelles:

  • créer deux sous-classes de tâches (de tâche d'importation de céleri). Ajoutez une variable d'instance supplémentaire (membre de classe) à la sous-classe de tâches Interactive définie sur false par défaut et qui indique que certaines entrées utilisateur sont toujours nécessaires. D'une manière ou d'une autre, vous avez accès à l'instance de la tâche et la définissez à l'extérieur de l'ouvrier de céleri (bien que j'aie beaucoup regardé cela et qu'il ne semble pas possible d'accéder aux objets Tâche directement depuis un autre module)
  • Partitionner la chaîne en plusieurs chaînes délimitées par des tâches interactives. Avoir une sorte de mécanisme à l'extérieur du travailleur céleri détecter une fois qu'une chaîne a atteint sa fin et déclencher le composant côté client interactif de la tâche interactive. Une fois que l'utilisateur a saisi toutes ces données, récupérez les données et démarrez la nouvelle chaîne où la tâche interactive est en tête de la nouvelle chaîne.

Répondre

2

Nous avons implémenté quelque chose comme votre deuxième idée dans notre projet & cela fonctionne très bien. Voici l'essentiel de la mise en œuvre.

Ajoutez un nouveau champ status à votre modèle &.

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

col status variable au modèle qui est utile pour afficher l'élément d'interface utilisateur pour l'utilisateur d'entrer des informations. Lorsque l'utilisateur saisit les informations requises, changez le statut. Cela appelle custom_func qui déclenche votre interactive_task.

Questions connexes