芹菜节拍队列包括过时的任务

Posted

技术标签:

【中文标题】芹菜节拍队列包括过时的任务【英文标题】:Celery beat queue includes obsolete tasks 【发布时间】:2013-05-16 05:03:02 【问题描述】:

我在 Django 中使用定期 celery 任务。我曾经在我的 app/tasks.py 文件中有以下任务:

@periodic_task(run_every=timedelta(minutes=2))
def stuff():
  ...

但是现在这个任务已经从我的 app/tasks.py 文件中删除了。但是,我一直在我的 celery 日志中看到对此任务的调用:

[2013-05-21 07:08:37,963: ERROR/MainProcess] Received unregistered task of type u'app.tasks.stuff'.

我使用的 celery beat 调度器似乎没有更新它的队列。这是我的 project/settings.py 文件中定义调度程序的方式:

CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

重新启动 celery worker 没有帮助。仅供参考,我使用 Redis 代理。

如何清除或更新 celery beat 队列,以免将旧任务发送给我的 celery worker?

【问题讨论】:

我认为您还必须删除时间表的数据库条目。您可以从 django 管理员处执行此操作。 嗨,Regis,您是否设法解决了这个问题。我有同样的问题。 @Ngenator - 你的解决方案是 问题可能出在redis服务器上。由于 celery 任务是被推送到 redis 服务器的腌制对象,因此 redis 继续持有过时的任务。重启redis服务器,或者调用任务的purge函数。 【参考方案1】:

安装django-celery。

如前所述,此项目不需要使用 celery,但您需要它来启用 /admin/djcelery/ 的管理界面来管理周期性任务。最初不会有注册或定期任务。

重新启动节拍并再次检查表定期任务。 Beat 会使用设置或装饰器中定义的间隔或 crontab 将现有的计划任务添加到该表中。在那里您可以删除不需要的任务。

更新:来自 celery4,推荐使用这个包。 https://github.com/celery/django-celery-beat

【讨论】:

【参考方案2】:

删除最初编写任务的 .pyc 文件。或者,只需删除项目目录中的所有 .pyc 文件。

这个命令应该可以工作:

find . -name "*.pyc" -exec rm -rf  \;

How do I remove all .pyc files from a project?

【讨论】:

这行不通!我也试过删除celerybeat-schedule

以上是关于芹菜节拍队列包括过时的任务的主要内容,如果未能解决你的问题,请参考以下文章

芹菜节拍服务旧(已删除)任务

芹菜节拍不接周期性任务

芹菜节拍:crontab 两次执行相同的任务(间隔 10 分钟)

Celery Beat:一次限制为单个任务实例

芹菜:访问上次运行任务的时间?

如何取消芹菜队列上的任务? [复制]