Django celery 定期任务间隔更改未在数据库中更新

Posted

技术标签:

【中文标题】Django celery 定期任务间隔更改未在数据库中更新【英文标题】:Django celery periodic task interval change is not updating in database 【发布时间】:2020-11-02 10:27:58 【问题描述】:

我正在使用 Django 2.2 和 Celery 的周期性任务来创建一个 cron 作业,该作业之前设置为每隔 2 小时运行一次,例如

@periodic_task(name='authentication.periodic_task.custom', run_every=timedelta(hours=2))

现在,我将其更改为每天下午 2 点运行,而不是每两个小时运行一次,并且更新的时间表是

@periodic_task(
    name='authentication.periodic_task.custom',
    run_every=crontab(hour=2, minute=0)
)

timedelta 替换为crontab,但任务仍每2 小时执行一次。

当我检查 Django 管理员时,它在Periodic Tasks 表中有一个列表,其中包含以下数据

为什么代码中句号的变化在数据库中没有更新?

celery 配置为通过 supervisor 运行

# Run app
celery -A app worker -l info

# Run celery beat
celery -A app beat -l debug

【问题讨论】:

你使用什么调度器类 【参考方案1】:

更可能的原因是运行不正确。

Celery worker 只是运行一个周期性任务,但它只运行一个已经在异步队列中的任务。为此,您可以运行 embed celery beat:

celery -A proj worker -B

如果您永远不会运行多个工作节点,但它不常用,因此不建议将其用于生产环境,这很方便。

【讨论】:

对不起,我忘了提 celery run 命令。使用来自主管的相同命令。更新了问题。【参考方案2】:

考虑到您似乎正在使用数据库支持的定期任务,您应该在数据库中编辑您的任务执行规则,如example。


这种类型的 celery-beat 后端不使用任务装饰器来设置节拍规则,而是应该按照文档创建数据库模型,您还可以从 Django Admin 添加或编辑任务执行规则

【讨论】:

以上是关于Django celery 定期任务间隔更改未在数据库中更新的主要内容,如果未能解决你的问题,请参考以下文章

Celery 和 Django 的定期任务

Django + Telegram + Celery 的定期和非定期任务

使用 django 和 celery 运行定期任务

在使用 django_celery_beat 设置的 Django 视图中使用 Celery 定期任务输出,并使用 Redis 设置缓存

Elastic Beanstalk 上的 Django 中的定期任务(可能使用 celery beat)

Django 1.9 + celery + django-celry 实现定时任务