2017-10-06 5 views
0

J'essaye d'incorporer la file d'attente de python huey dans mon application de flacon, et j'ai tout fonctionné et tout. Je l'utilise pour exécuter une tâche dans mon flux de travail, et pendant que la tâche est en cours je la cache à l'utilisateur (ajoute task_id de huey.task à mon taskstatus dans la base de données) - sinon il semblerait que la même tâche soit bloquée, mais en réalité ça fonctionne en arrière-plan.Écouter des événements python huey - exécuter une fois l'écouteur?

Maintenant, la partie difficile est de montrer ma tâche pendant que la tâche huey est terminée. J'ai incorporé l'écouteur d'événement (parcourez huey.storage) comme dans les docs huey mais d'après ce que je comprends, il s'abonne à redis et s'exécute indéfiniment (puisqu'il y a une vérification périodique des tâches). D'après ce que je comprends l'auditeur d'événement lui-même doit fonctionner en thread séparé, donc je l'ai écrit Huey tâche d'écouter les tâches huey:

@huey.task(include_task=True) 
def get_huey_events(task): 
    from huey.consumer import EVENT_FINISHED 
    app = create_huey_app('development') 
    with app.app_context(): 
     # store huey task id and name in database 
     task1 = HueyTask(task.task_id, task.name) 
     db.session.add(task1) 
     db.session.commit() 
     for event in huey.storage: 
      if event['status'] == EVENT_FINISHED: 
       # consume result to remove from storage 
       result = huey.result(event['id']) 
       # remove huey id from my task status - inidicates the task finished - my task will be shown to user 
       status = WorkflowProcessStatuses.query.filter_by(huey_id=event['id']).first() 
       if status: 
        status.huey_id = None 
        db.session.add(status) 
        db.session.commit() 

Mais mettre cette façon signifie que cette tâche nécessaire d'exécuter une seule fois - depuis il consomme un travailleur pour toujours - bientôt il n'y aura plus de travailleurs libres. Je commence tâche get_huey_events ci-dessus tout en créer usine d'applications est géré comme ceci:

with app.app_context(): 
    task1 = HueyTask.query.filter_by(name='queuecmd_get_huey_events').first() 
    pipe = redis.StrictRedis() 
    if task1: 
     exists = pipe.hexists('huey.tasks', task1.id) 
    else: 
     exists = 0 
    if task1 is None or not exists: 
     if task1 and not exists: 
      #clean old task if not running now 
      pipe.hdel('huey.tasks', task1.id) 
      db.session.delete(task1) 
      db.session.commit() 
     result = get_huey_events() 
     pipe.hset('huey.tasks',result.task.task_id,'Event listener') 

donc j'obtenir mon identifiant stocké de get_huey_events Huey tâche et voir si elle est stockée dans la base de données Redis dans ma coutume a créé huey.tasks nom avec le touche task.id S'il y a une tâche dans la base de données mais pas dans redis, ou s'il n'y a pas de tâche dans la base de données, alors je lance l'écouteur d'événement, sinon non.

Ma question est - y a-t-il une meilleure façon de faire? L'écouteur d'événement lui-même devrait-il être un huey.task? Je cours sous Windows pour le moment.

Répondre

0

Vous pouvez simplement démarrer un ancien thread régulier pour exécuter l'écouteur d'événement si vous le souhaitez. Cela n'a pas besoin d'être une tâche.