2011-07-16 110 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