gpt4 book ai didi

django - 从 celery_beat 中删除项目不会将它们从数据库计划中删除

转载 作者:行者123 更新时间:2023-12-05 02:12:26 27 4
gpt4 key购买 nike

我在 Django 应用程序中使用 django-celery-beat(这将计划存储在数据库中而不是本地文件中)。我已经通过 celery_beat 配置了我的日程安排,Celery 是通过 app.config_from_object(...)

初始化的

我最近重命名/删除了一些任务并重新启动了应用程序。新任务出现了,但是从 celery_beat 字典中删除的任务并没有从数据库中删除。

这是预期的工作流程——需要从数据库中手动删除任务吗?是否有一种解决方法可以在 Django 启动时自动协调计划?

我在 celery/__init__.py 中尝试了 PeriodicTask.objects.all().delete()

def _clean_schedule():                                                         
from django.db import transaction
from django_celery_beat.models import PeriodicTask
from django_celery_beat.models import PeriodicTasks
with transaction.atomic():
PeriodicTask.objects.\
exclude(task__startswith='celery.').\
exclude(name__in=settings.CELERY_CONFIG.celery_beat.keys()).\
delete()
PeriodicTasks.update_changed()
_clean_schedule()

但这是不允许的,因为 Django 还没有正确启动:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

您也不能使用 Django 的 AppConfig.ready(),因为不支持在 ready() 中进行查询/数据库连接。

最佳答案

查看 django-celery-beat 实际如何安装时间表,我想我也许可以 Hook 到那个过程。

它不会在 Django 启动时发生——它会在 beat 启动时发生。它针对在节拍命令行上传递的类调用 setup_schedule()

因此,我们可以用

覆盖调度器
--scheduler=myproject.lib.scheduler:DatabaseSchedulerWithCleanup

清理:

import logging

from django_celery_beat.models import PeriodicTask
from django_celery_beat.models import PeriodicTasks
from django_celery_beat.schedulers import DatabaseScheduler
from django.db import transaction


class DatabaseSchedulerWithCleanup(DatabaseScheduler):

def setup_schedule(self):
schedule = self.app.conf.beat_schedule
with transaction.atomic():
num, info = PeriodicTask.objects.\
exclude(task__startswith='celery.').\
exclude(name__in=schedule.keys()).\
delete()
logging.info("Removed %d obsolete periodic tasks.", num)
if num > 0:
PeriodicTasks.update_changed()
super(DatabaseSchedulerWithCleanup, self).setup_schedule()

请注意,只有当您专门使用beat_schedule 管理任务时才需要这个。如果您通过 Django 管理或以编程方式添加任务,它们也会被删除。

关于django - 从 celery_beat 中删除项目不会将它们从数据库计划中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56047284/

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