2011-07-16 66 views
0

我有一个特定的参数的任务,我想知道是否有一个具有相同参数的任务。 我有以下几点:如何管理芹菜中的任务?

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

不过,我想这样的:

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

我怎样才能做到这一点?

回答

0

您可能意味着您只想在每个时刻为每个唯一ID运行一个“some_task”。所以你必须实现一个锁定机制。看看here。芹菜在Redis中很棒!

+0

笔者装置:T = add.delay(2,4)在同一时间不能执行两次。 t1 = add.delay(2,4),t.id应该等于t1.id –

0

这里是我的解决方案:

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