我有一个带有某个参数的任务,我想知道是否有一个具有相同参数的任务。 我有以下内容:
@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 :(得分:0)
你可能意味着每个时刻你只想为每个唯一的id运行一个“some_task”。所以你必须实现一个锁定机制。看看here。 Celery和Redis一起玩得很棒!
答案 1 :(得分: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