Ale*_*yko 2 python rabbitmq celery
我正在编写一个小的Django应用程序,我应该能够为每个模型对象创建它的周期性任务,该任务将以一定的间隔执行.我用这个Celery应用程序,但我无法理解一件事:
class ProcessQueryTask(PeriodicTask):
run_every = timedelta(minutes=1)
def run(self, query_task_pk, **kwargs):
logging.info('Process celery task for QueryTask %d' %
query_task_pk)
task = QueryTask.objects.get(pk=query_task_pk)
task.exec_task()
return True
Run Code Online (Sandbox Code Playgroud)
然后我做了以下事情:
>>> from tasks.tasks import ProcessQueryTask
>>> result1 = ProcessQueryTask.delay(query_task_pk=1)
>>> result2 = ProcessQueryTask.delay(query_task_pk=2)
Run Code Online (Sandbox Code Playgroud)
第一次调用是成功的,但其他定期调用返回错误 - TypeError:run()在celeryd服务器中只接受2个非关键字参数(给定1个).我可以将自己的参数传递给PeriodicTask run()
吗?
Ask Solem在回答你关于芹菜用户谷歌集团的问题时,回答得非常好.
定期任务不使用参数,因此您需要创建多个类或创建一个处理多个"模型"的定期任务.
例如:
from celery.task import PeriodicTask
from celery.decorators import periodic_task
# base class
class BaseProcessQueryTask(PeriodicTask):
abstract = True
run_every = timedelta(minutes=1)
query_task_pk = None
def run(self):
task = QueryTask.objects.get(pk=self.query_task_pk)
task.exec_task()
class ProcessQueryTask1(BaseProcessQueryTask):
query_task_pk = 1
class ProcessQueryTask2(BaseProcessQueryTask):
query_task_pk = 2
Run Code Online (Sandbox Code Playgroud)
但你更有可能想要这样的东西:
@task(ignore_result=True)
def execute_query_task(task):
task.exec_task()
@periodic_task(run_every=timedelta(minutes=1))
def process_query_tasks():
for task in QueryTask.objects.all():
ExecuteQueryTask.delay(task)
Run Code Online (Sandbox Code Playgroud)