拥有Celery中的PeriodicTask run()方法的参数

时间:2010-05-17 14:48:34

标签: 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

然后我会关注:

>>> from tasks.tasks import ProcessQueryTask
>>> result1 = ProcessQueryTask.delay(query_task_pk=1)
>>> result2 = ProcessQueryTask.delay(query_task_pk=2)

第一次调用是成功,但其他定期调用返回错误 - TypeError:run()正好接受2个非关键字参数(给定1个) 芹菜服务器。 我可以将自己的参数传递给PeriodicTask run()吗?

1 个答案:

答案 0 :(得分:5)

这是由Ask Solem在his response to your question celery-users Google group上的精彩回答。

定期任务不使用参数,因此您需要制作几个 类或定期处理多个“模型”的任务。

E.g:

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

但你更有可能想要这样的东西:

@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)