Django 和 Celery 的示例:周期性任务

Posted

技术标签:

【中文标题】Django 和 Celery 的示例:周期性任务【英文标题】:Examples of Django and Celery: Periodic Tasks 【发布时间】:2012-01-03 16:47:46 【问题描述】:

我一直在与 Django/Celery 文档作斗争,现在需要一些帮助。

我希望能够使用 django-celery 运行定期任务。我在互联网(和文档)中看到了几种不同的格式和模式,说明应该如何使用 Celery 实现这一目标......

有人可以提供创建、注册和执行 django-celery 周期性任务的基本功能示例吗?特别是,我想知道我是否应该编写一个扩展 PeriodicTask 类的任务并注册它,或者我是否应该使用 @periodic_task 装饰器,或者我是否应该使用 @task 装饰器,然后为任务的执行。

我不介意这三种方式是否都可行,但我希望看到至少一种可行方式的示例。非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

example from the docs 有什么问题?

from celery.task import PeriodicTask
from clickmuncher.messaging import process_clicks
from datetime import timedelta


class ProcessClicksTask(PeriodicTask):
    run_every = timedelta(minutes=30)

    def run(self, **kwargs):
        process_clicks()

您可以使用装饰器编写相同的任务:

from celery.task.schedules import crontab
from celery.task import periodic_task

@periodic_task(run_every=crontab(minute="*/30"))
def process_clicks():
    ....

decorator syntax 仅允许您将现有功能/任务转变为周期性任务,而无需直接修改它们。

对于要执行的任务celerybeat must be running.

【讨论】:

感谢您的回答。很高兴知道装饰器的确切用途以及为什么存在两种形式的同一事物。那么我不必注册 PeriodicTasks 是否正确?我发现这个例子在文档中很难找到,它可以简化(就像你在上面所做的那样)。再次感谢。 嘿,这是文档中的另一个示例:ask.github.com/celery/reference/celery.decorators.html 如果您使用装饰器,则不必显式注册任务。如果您更熟悉的话,它与您在 Django (docs.djangoproject.com/en/dev/howto/custom-template-tags/…) 中注册模板标签和过滤器的选项非常相似。 再次感谢您的帮助。 如何检查 celery 是否接了计划任务?运行manage.py celery inspect registered时可以看到任务已注册,但manage.py celery inspect scheduled中没有。我有工人,beat 正在运行。 自 Celery 3.1 起,@periodic_task 装饰器已被弃用。 github.com/celery/celery/issues/1764

以上是关于Django 和 Celery 的示例:周期性任务的主要内容,如果未能解决你的问题,请参考以下文章

Django + Celery:如何将带有参数的任务链接到周期性任务

在 celery 3.1 中,制作 django 周期性任务

芹菜节拍不接周期性任务

Celery异步任务队列/周期任务+ RabbitMQ + Django

markdown Django的Celery 4周期性任务

Django celery beat 在 Elastic Beanstalk 上看不到周期性任务