【问题标题】:Using celery beat as a scheduler for irregular intervals?使用 celery beat 作为不规则间隔的调度程序?
【发布时间】:2017-03-15 06:47:30
【问题描述】:

我有一个 django 应用程序,它允许用户创建多个不同的博客。每个博客需要每小时/每天/每周等收集模型数据(例如访问次数、点击次数等),并且收集数据的时间间隔可能因博客而异。此外,在某个时间点,用户可能希望更改数据收集的频率,例如在用户界面上从每周到每天。

查看官方文档中的Periodic Tasks,看来我必须将间隔值“硬编码”到设置文件中,并且我只能指定一次间隔,例如

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    # Executes every Monday morning at 7:30 A.M
    'add-every-monday-morning': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

我该如何解决这个问题,或者 celery 是否可以在不同的时间间隔安排多个相同类型的任务并通过用户界面(通过 AJAX)更改值?

【问题讨论】:

  • 使用django-celery,您可以使用djcelery.schedulers.DatabaseScheduler,它允许您在django admin 中管理您的周期性任务。 celery docs
  • changing the frequency of data collection 太酷了。我将在github.com/rajasimon/beatserver 中编写功能
  • @devxplorer 我正在尝试django-celery-beat,它似乎正在取代django-celery(如果不是这种情况,请告诉我)。我现在面临的问题是,当我添加新的 PeriodicTasks 时,它们不会执行,直到我重新启动节拍过程 (celery -A proj beat -l info -S django)。
  • 一切都应该工作而无需重新启动。但是如果批量更新周期性任务,则需要手动更新计数器:PeriodicTasks.changed(),来自docs

标签: django celery django-celery celery-task celerybeat


【解决方案1】:

正如@devxplorer 所指出的,django-celery 提供了一个数据库后端。您可以使用它通过 Django 管理员以编程方式管理任务,或通过 API 公开模型。

from djcelery.models import PeriodicTask

PeriodicTask(
    name="My First Task",
    ...
).create()
all_tasks = PeriodicTask.objects.all()
...

然后开始节拍过程

$ celery -A proj beat -S djcelery.schedulers.DatabaseScheduler

【讨论】:

  • 我注意到,当我在启动节拍过程后创建定期任务时,新任务不会运行,直到我重新启动节拍过程。创建新的周期性任务时如何自动重启beat进程?
  • @FatHippo 你可以添加一个外部文件观察器——最后我听说,--autoreload 标志很糟糕。我尝试使用它一次,结果在兔子洞里呆了 3 天,因为它以一种非常微妙的方式破坏了事物。我认为它已在最新版本中被删除; docs.celeryproject.org/en/latest/…
猜你喜欢
  • 2016-09-20
  • 2015-09-07
  • 2020-06-05
  • 2021-01-08
  • 2022-01-20
  • 2020-05-31
  • 2018-09-17
  • 2021-03-09
  • 2021-07-05
相关资源
最近更新 更多