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

Posted

技术标签:

【中文标题】在 celery 3.1 中,制作 django 周期性任务【英文标题】:In celery 3.1, making django periodic task 【发布时间】:2013-12-05 15:55:30 【问题描述】:

Django 中的变化太大,所以我不能使用 3.1。我需要一些帮助。

我阅读了有关 make a task in django 的信息,并阅读了 Periodic Tasks 文档。但我不知道如何在 django 中进行周期性任务。我认为这是因为我的英语水平低..

在旧版本的 Celery 中,我导入了 djcelery&crontab 并在 settings.py 中设置了 CELERYBEAT_SCHEDULE,并由 执行manage.py.

但是我好像不能再用那种方式执行芹菜恶魔了。比我应该把 CELERYBEAT_SCHEDULE 放在哪里?在文档中的 django 示例中,他们设置了 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')proj/proj/celery.py 中。 (1) 那么在settings.py中设置celerybeat(和之前一样)可以吗?

(2) 如果可以的话,一个在 django 中制作周期性任务的小例子会很有帮助。当我阅读教程时,最令人困惑的部分是文件路径。如果您不想提供完整的示例,如果您解释我应该在哪里创建任务、设置节拍和执行守护进程,我将不胜感激。

感谢阅读。

【问题讨论】:

【参考方案1】:

我假设您已经阅读了文档中的django section,但是您是否看过这个example project?

它不使用调度器,但如果你将它添加到settings.py:

from __future__ import absolute_import

from celery.schedules import crontab


CELERYBEAT_SCHEDULE = 
    # crontab(hour=0, minute=0, day_of_week='saturday')
    'schedule-name':   # example: 'file-backup' 
        'task': 'some_django_app.tasks....',  # example: 'files.tasks.cleanup' 
        'schedule': crontab(...)
    ,


# if you want to place the schedule file relative to your project or something:
CELERYBEAT_SCHEDULE_FILENAME = "some/path/and/filename"

现在是命令,忘记manage.py,直接输入celery

-B 一如既往地启用 celery beat。

-A 指定 celery 应用的名称。注意示例项目的celery.py 中的这一行:app = Celery('proj')

celery -A proj worker -B -l info

'django-celery' 不需要,只有在需要管理时才安装它 来自管理员的计划,或者如果您想将任务结果存储在数据库中 通过 django 的 ORM:

INSTALLED_APPS += ('djcelery',)

# store schedule in the DB:
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

【讨论】:

from celery.schedules import crontab 这行给了我错误:“没有名为 schedules 的模块” @JonCrowell 刚刚检查并且导入是正确的。您的设置一定有问题。 您是否在设置文件中添加了from __future__ import absolute_import?如果不是,python 将尝试从您的 celery.py 文件中导入计划。 直接来自 celery doc """你也可以通过启用 workers -B 选项开始在worker中嵌入beat,如果你永远不会运行多个worker节点,这很方便,但它不常用因此不建议用于生产用途:$ celery -A proj worker -B""" 注意 - 现在需要将其称为 CELERY_BEAT_SCHEDULE(最新版本)【参考方案2】:

您可以使用 django-celery 应用程序:https://pypi.python.org/pypi/django-celery

安装

pip install django-celery

要为您的项目启用 django-celery,您需要将 djcelery 添加到 INSTALLED_APPS:

INSTALLED_APPS += ("djcelery", )
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

然后将以下行添加到您的 settings.py:

import djcelery
djcelery.setup_loader()

用法

在 linux 上,你可以像这样使用 celery-beat 运行 worker:

python manage.py celeryd worker --loglevel=DEBUG  -E -B -c 1
python manage.py help celeryd #to find out the args meaning

您还想在 django admin 中监控任务。要启用监控功能,您需要运行 celerycam:

python /var/www/gorod/manage.py celerycam

要制作周期性任务,您可以使用 celery.decorators.periodic_task。

# myapp/tasks.py
import datetime
import celery

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def myfunc():
    print 'periodic_task'

或者使用

# settings.py
CELERYBEAT_SCHEDULE = 
    'add-every-30-seconds': 
        'task': 'tasks.add',
        'schedule': timedelta(seconds=30),
        'args': (16, 16)
    ,

【讨论】:

@periodic_task 装饰器在 Celery 3.1 中已弃用。 github.com/celery/celery/issues/1764

以上是关于在 celery 3.1 中,制作 django 周期性任务的主要内容,如果未能解决你的问题,请参考以下文章

django celery使用

django入门 celery使用

使用 django 和 celery 运行定期任务

django 1.11 与 celery 4.0 和 djcelery 兼容性问题

python测试开发django-196.python3.8+django2+celery5.2.7环境准备

xadmin引入celery执行异步任务与定时任务