【发布时间】:2021-06-13 07:36:09
【问题描述】:
我正在尝试在 Django 中使用 Celery 设置一个任务,使其每天在 23:00 运行。
app = Celery('App.tasks', broker='redis://localhost')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "App.settings")
django.setup() <== PROBLEM
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(
crontab(hour=23),
calc_average_rating.s(),
)
@app.task
def calc_average_rating(final_content_id):
问题是,在这个函数中,我有Rating = apps.get_model(app_label='App', model_name='Rating'),如果我不调用django.setup(),我就会得到django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.。
但是,如果我打电话给django.setup(),任务运行良好,但我不能做manage.py runserver,因为我得到RuntimeError: populate() isn't reentrant。
有什么解决办法吗?
【问题讨论】:
-
我很想知道具体问题是什么,主要是需要为 Celery 提供 django 应用程序包名称而不是任务模块名称吗?
-
我认为问题在于我没有启动
worker,因为我认为只需要beat,但我不确定。
标签: django celery django-celery