30

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

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

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

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

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

谢谢阅读。

4

2 回答 2

61

我假设您已经阅读了文档中的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"

现在对于命令,忘记了manage.pycelery直接输入:

-B像往常一样启用芹菜节拍。

-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'
于 2013-11-21T11:36:12.467 回答
23

您可以使用 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)
    },
}
于 2013-11-21T11:48:19.053 回答