Django Celery Планирование команды manage.py

Мне нужно обновить индекс Solr по расписанию с помощью команды:

(env)$ ./manage.py update_index

Я просмотрел документы Celery и нашел информацию о расписании, но не смог найти способ запустить команду управления django по расписанию и внутри virtualenv. Будет ли это лучше работать на обычном кроне? И если да, то как бы мне запустить его в virtualenv? Кто-нибудь имеет опыт работы с этим?

Спасибо за помощь!

3 ответа

Решение

Чтобы периодически запускать команду из задания cron, просто оберните команду в скрипт bash, который загружает virtualenv. Например, вот что мы делаем для запуска команд manage.py:

django_cmd.sh:

#!/bin/bash

cd /var/www/website/
source venv/bin/activate
/var/www/website/manage.py $1 --settings=$2

Crontab:

MAILTO=webmaster@website.com
SETTINGSMODULE=website.settings_prod
5 * * * * /var/www/website/django_cmd.sh update_index $SETTINGSMODULE >> /dev/null
0 10 * * * /var/www/website/django_cmd.sh update_accounts $SETTINGSMODULE 

Структура проекта Django Celery Task Scheduling

[appname]/
├── [appname]/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── celery.py
│   └── wsgi.py
├── [project1]/
│   ├── __init__.py
│   ├── tasks.py
│   
└── manage.py

добавьте ниже конфигурацию в файл settings.py:

STATIC_URL = '/static/'
BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis'
from celery.schedules import crontab
CELERY_TIMEZONE = 'UTC'

celery.py: содержит планировщик задач сельдерея

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
import django
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appname.settings')
from django.conf import settings
app = Celery('appname')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
**#scheduler**
app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'project1.tasks.cleanup',
        'schedule': 30.0,
        'args': ()
    },
}
app.conf.timezone = 'UTC'

init.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ['celery_app']

tasks.py из project1

from celery import shared_task
import celery
import time
from django.core import management
@celery.task#(name='cleanup')
def cleanup():
    try:
        print ("in celery module")
        """Cleanup expired sessions by using Django management command."""
        management.call_command("clearsessions", verbosity=0)
        #PUT MANAGEMENT COMMAND HERE
        return "success"
    except:
        print(e)

Задача будет запускаться через каждые 30 секунд

Требование к окнам:

  1. Redis сервер должен быть запущен
  2. рабочий сельдерея и ритм сельдерея должны быть запущены, запустите каждую команду на другом терминале

    сельдерей

    сельдерей

Требование к Linux:

  1. Redis сервер должен быть запущен
  2. работник сельдерея и сельдерей должен работать с сельдереем, и работник может быть запущен на одном сервере

    сельдерей -A приложение имя работника -l информация -B

@ tzenderman, пожалуйста, дайте мне знать, если я что-то пропустил. Для меня это работает нормально

Я действительно нашел хороший способ сделать это, используя ткань + сельдерей, и сейчас я работаю над этим:

В app/tasks.py создайте функцию Fabric с нужными вам командами manage.py, а затем украсьте ее @periodic_task, добавьте это к своему графику сельдерея, и это должно быть хорошо пойти.

ОБНОВЛЕНИЕ: я не смог фактически использовать Fabric + Celery, потому что использование fabric в модуле привело к тому, что он был распознан как файл fabric, а вызовы celery в файле не работали.

Другие вопросы по тегам