2011-07-16 5 views
0

J'ai une tâche avec un certain paramètre, et je veux savoir s'il y a une tâche avec le même paramètre. Je donne les résultats suivants:Comment gérer les tâches dans Céleri?

@task 
def some_task(id): 
    some_task.update_state(state="PROGRESS", meta={"id": id}) 
    some_action_by_id(id) 

Mais je voudrais ceci:

@task 
def some_task(id): 
    if !check_task(id): 
    some_task.update_state(state="PROGRESS", meta={"id": id}) 
    some_action_by_id(id) 

Comment puis-je y arriver?

Répondre

0

Vous voulez probablement dire que vous ne voulez qu'une "certaine_tâche" s'exécutant pour chaque identifiant unique à chaque instant. Vous devez donc mettre en place un mécanisme de verrouillage. Jetez un oeil here. Céleri joue super avec Redis!

+0

L'auteur signifie: t = add.delay (2,4) ne peut pas exécuter deux fois en même temps. t1 = add.delay (2, 4), le t.id devrait être t1.id –

0

voici ma solution:

from celery.task.control import inspect 
from celery.result import AsyncResult 

def get_same_task(aTaskName, aArgs, aHosts): 
    for jobs in aHosts.values(): 
     for job in jobs: 
      if job['name'] == aTaskName and job['args'] == str(aArgs): 
       return job['id'] 
    return None 

class IgnoreSameArgumentsTask(Task): 
    abstract = True 
    inspect = inspect() 

    def delay(self, *args, **kwargs): 
     vHosts_Jobs = self.inspect.active() 
     vTaskId = get_same_task(self.name, args, vHosts_Jobs) 
     if vTaskId != None: 
      return AsyncResult(vTaskId) 
     else: 
      return super(IgnoreSameArgumentsTask, self).delay(*args, **kwargs) 

@celery.task(base=IgnoreSameArgumentsTask) 
def add(x, y): 
    sleep(x+y) 
    return x + y 
Questions connexes