2

我的应用程序PeriodicTask根据用户定义的计划创建对象。也就是说,PeriodicTask 的计划可以随时更改。过去几天一直在沮丧地试图弄清楚如何让 Celery 支持这一点。归根结底,问题在于,PeriodicTask首先必须创建一个作为它运行的东西,然后必须注册(我不知道为什么需要这样做)。

所以,为了让动态任务起作用,我需要

  1. 在 celery 服务器启动时注册所有任务
  2. 在新创建任务时注册任务。

#1应该通过运行启动脚本很容易解决(即,在./manage.py celerybeat被调用之后运行的东西)。不幸的是,我不认为有一个方便的地方放这个。如果有,脚本将如下所示:

from djcelery.models import PeriodicTask
from celery.registry import tasks
for task in PeriodicTask.objects.filter(name__startswith = 'scheduler.'):
  tasks.register(task)

我正在过滤“调度程序”。因为我所有的动态任务的名称都是这样开始的。

#2我不知道。就我所见,问题在于它celery.registry.tasks保存在内存中,除非有一些编码魔法,否则一旦它开始运行,就无法访​​问 celerybeat 的任务注册表。

在此先感谢您的帮助。

4

0 回答 0