Celery 和 Django 的定期任务

Posted

技术标签:

【中文标题】Celery 和 Django 的定期任务【英文标题】:Periodic Tasks with Celery and Django 【发布时间】:2014-02-23 06:11:22 【问题描述】:

我无法使用 Celery 3.1.8、Django 1.6.1 和 RabbitMQ 运行定期任务。我对当前的文档有点困惑,因为我知道不再需要 django-celery 来让 Celery 与 Django 一起运行。我有一种感觉,我没有正确地运行工人,但是在搜索 SO 的解决方案和谷歌搜索之后,我需要帮助。谁能指出我正确的方向?

settings.py(不确定我是否需要这个,因为我的任务上有一个@periodic_task 装饰器)

CELERYBEAT_SCHEDULE = 
    'add-every-30-seconds': 
        'task': 'tasks.send_test_email',
        'schedule': datetime.timedelta(seconds=30)
    ,

我的应用程序(celery.py)

from __future__ import absolute_import

import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')

app = Celery('app',
             broker='amqp://',
             backend='amqp://',
             include=['app.tasks'])


app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600,
    CELERY_TIMEZONE='Europe/Oslo',
    )

if __name__ == '__main__':
    app.start()

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: 0!r'.format(self.request))

定期任务(tasks.py)

from __future__ import absolute_import
from celery.task import periodic_task
import datetime

@periodic_task(run_every=datetime.timedelta(minutes=1))
def send_test_email():
    print "This is a periodic task from celery"

在命令行上,我正在执行 worker:

celery worker -A app -l info
celery beat

【问题讨论】:

所以在进行了更多修改之后,我能够让它工作。问题是我如何执行工人。这成功了:celery -A app beat 您应该将其添加为答案而不是评论:) 【参考方案1】:

其他一些解决方案是使用@periodic_task celery decorator

from celery.schedules import crontab

@periodic_task(run_every=crontab(minute=0, hour=1))
def my_task():
    print 'my_task'

【讨论】:

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

使用 django 和 celery 运行定期任务

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

Django Celery Beat 管理员更新 Cron Schedule 定期任务未生效

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

Celery第一步

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