Пример периодической задачи Django Celery

Мне нужен минимальный пример для выполнения периодической задачи (запускать какую-то функцию каждые 5 минут или запускать что-то в 12:00:00 и т. д.).

В моем myapp/tasks.py у меня есть,

from celery.task.schedules import crontab
from celery.decorators import periodic_task
from celery import task


@periodic_task(run_every=(crontab(hour="*", minute=1)), name="run_every_1_minutes", ignore_result=True)
def return_5():
    return 5


@task
def test():
    return "test"

Когда я запускаю celery worker, он показывает задачи (приведенные ниже), но не возвращает никаких значений (ни в терминале, ни в цветке).

[tasks]
  . mathematica.core.tasks.test
  . run_every_1_minutes

Пожалуйста, предоставьте минимальный пример или подсказки для достижения желаемых результатов.

Предыстория:

У меня есть config/celery.py, который содержит следующее:

import os
from celery import Celery

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")

app = Celery('config')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

И в моем config/__init__.py у меня есть

from .celery import app as celery_app

__all__ = ['celery_app']

Я добавил функцию, как показано ниже в myapp/tasks.py

from celery import task

@task
def test():
    return "test"

Когда я запускаю test.delay() из оболочки, он работает успешно, а также отображает информацию о задаче в виде цветка.


person inquilabee    schedule 25.05.2018    source источник
comment
Как вы управляете рабочим? Используете ли вы опцию -B: celery -A proj worker -B ?   -  person neverwalkaloner    schedule 25.05.2018
comment
вот так, celery -A config worker -l info   -  person inquilabee    schedule 25.05.2018


Ответы (1)


Чтобы запустить периодическую задачу, вы должны запустить celery beat< /а> также. Вы можете запустить его с помощью этой команды:

celery -A proj beat

Или, если вы используете одного работника:

celery -A proj worker -B
person neverwalkaloner    schedule 25.05.2018
comment
Должен ли я запускать celery -A proj worker -l info и celery -A proj beat на двух разных терминалах? Я сделал то же самое и запустил цветок, используя celery -A config flower. Жду пять минут и ничего не происходит (ни в терминалах, ни в цветке) - person inquilabee; 25.05.2018
comment
test.delay() из оболочки все еще работает, и обновления отображаются на терминале и в цветке. Однако периодическая задача не выполняется. Любая помощь? - person inquilabee; 25.05.2018
comment
@Inquilabi да, вам нужно запустить их обоих. Вы видите в бит-терминале run_every_1_minutes задачу, выполненную? - person neverwalkaloner; 25.05.2018
comment
Нет. Мой бит-терминал выглядит так: LocalTime -> 2018-05-25 21:55:15 Configuration -> . broker -> redis://127.0.0.1:6379/1 . loader -> celery.loaders.app.AppLoader . scheduler -> celery.beat.PersistentScheduler . db -> celerybeat-schedule . logfile -> [stderr]@%WARNING . maxinterval -> 5.00 minutes (300s) Больше ничего не отображается. - person inquilabee; 25.05.2018
comment
Да. Я сделал. Если бы Redis не работал, task.delay() не запустился бы. - person inquilabee; 25.05.2018
comment
Получено «PONG» для «redis-cli ping». - person inquilabee; 25.05.2018
comment
Проблема решилась заменой run_every=(crontab(hour="*", minute=1)) на run_every=(crontab(minute="*/1")) - person inquilabee; 25.05.2018