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

mar*_*all 30 django celery celerybeat

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

我读到了在django中创建任务,并阅读了Periodic Tasks文档.但我不知道如何在django中定期执行任务.我想这是因为我的低级英语..

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

但似乎我再也不能以这种方式执行芹菜deamon了.比我应该把CELERYBEAT_SCHEDULE放在哪里?在docs的django示例中,它们设置os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')proj/proj/celery.py中.(1)所以在settings.py中设置celerybeat (就像之前一样)可以吗?

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

谢谢阅读.

Adr*_*ián 60

我假设您已经从文档中读过django部分,但是您是否看过这个示例项目

它不使用调度程序,但如果将其添加到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"
Run Code Online (Sandbox Code Playgroud)

现在为命令,忘了manage.py,直接输入 celery:

-B 使芹菜一如既往地击败.

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

celery -A proj worker -B -l info
Run Code Online (Sandbox Code Playgroud)

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

INSTALLED_APPS += ('djcelery',)

# store schedule in the DB:
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
Run Code Online (Sandbox Code Playgroud)

  • 你有没有添加`from __future__ import absolute_import`做你的设置文件?如果不是python将尝试从您的celery.py文件导入日程安排. (6认同)
  • 直接从celery doc"""你也可以通过启用worker -B选项开始在worker中嵌入beat,如果你永远不会运行多个worker节点,这很方便,但是它并不常用,因此不推荐使用生产用途:$ celery -A proj worker -B""" (2认同)
  • 注意 - 现在需要将其命名为CELERY_BEAT_SCHEDULE(最新版本) (2认同)

Yev*_*lev 23

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

安装:

pip install django-celery
Run Code Online (Sandbox Code Playgroud)

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

INSTALLED_APPS += ("djcelery", )
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
Run Code Online (Sandbox Code Playgroud)

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

import djcelery
djcelery.setup_loader()
Run Code Online (Sandbox Code Playgroud)

用法

在linux上你可以像这样运行celery-beat工作者:

python manage.py celeryd worker --loglevel=DEBUG  -E -B -c 1
python manage.py help celeryd #to find out the args meaning
Run Code Online (Sandbox Code Playgroud)

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

python /var/www/gorod/manage.py celerycam
Run Code Online (Sandbox Code Playgroud)

要定期执行任务,您可以使用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'
Run Code Online (Sandbox Code Playgroud)

或者使用

# settings.py
CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': timedelta(seconds=30),
        'args': (16, 16)
    },
}
Run Code Online (Sandbox Code Playgroud)

  • Celery 3.1中不推荐使用`@ periodic_task`装饰器.https://github.com/celery/celery/issues/1764 (8认同)