gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:06:57 25 4
gpt4 key购买 nike

我正在编写一个小型 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 个) celery 服务器。我可以将自己的参数传递给 PeriodicTask run() 吗?

最佳答案

Ask Solem 在 his response to your question 中对此做出了精彩的回答在 celery-users Google group 上.

定期任务不使用参数,所以你需要做几个类或制作处理多个“模型”的周期性任务。

例如:

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)

关于python - 拥有 Celery 中 PeriodicTask run() 方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com