Планировщик Celery Beat не будет выполнять мою задачу в Django

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

Я хочу запускать функцию в определенное время каждый день, что я делал с помощью crontab. Celery, видимо, лучше подходит для такого типа задач, поэтому я пытаюсь двигаться к этому решению.

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

Я видел много (!!!) различных настроек для сельдерея, поэтому мой код может содержать избыточность и ненужные строки.

Функция, которую я хочу вызвать, называется team_accountabillity() и присутствует в моем приложении «myteam.task.py».

У меня есть Celery 4.4.0, и я использую rabbitMQ в качестве диспетчера очередей (я также установил Redis, потому что многие учебники сопровождались этим).

Вот мой проект/settings.py

from __future__ import absolute_import
import os
from datetime import timedelta
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')


CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_BEAT_SCHEDULER = {
                        'team accountability': {
                        'task':'team_accountability', 'schedule': timedelta(seconds=10),
                        },
                    }
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True

INSTALLED_APPS = [
    'celerybeat_status',
    'django_celery_beat',
    'myteam.apps.MyteamConfig',
]

Файл proj/celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab
from django.apps import apps
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')


app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])

##documentation regarding the next line:
##https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#beat-entries
##I find it very weird that this command is very similar to the CELERY_BEAT_SCHEDULER in settings.py
##I honestly don't know what this does
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(10.0, team_accountability, name='team accountability')

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

Файл proj/init.py:

from __future__ import absolute_import, unicode_literals

from .celery import app as celery_app
__all__ = ('celery_app')

И, наконец, вот мое приложение/task.py (myteam/task.py)

from __future__ import absolute_import, unicode_literals

from celery import shared_task
from myteam.models import Team


##decorator should be @shared_task or @task???
@shared_task
def team_accountability():
    t_all = Team.objects.all()
    for t in t_all:
        total = 0
        s_all = t.stocks.all()
        for s in s_all:
            symbol = s.symbol
            queryset = Stock.objects.filter(symbol__contains=symbol).order_by("-id").first()
            total = total + queryset.change_percent
        t.total = round(total, 3)
        t.save()

С учетом всего сказанного, вот что я получаю, когда запускаю команду:

celery -A proj worker -l debug

Я получаю следующее:

[2020-02-21 12:39:03,420: DEBUG/MainProcess] | Worker: Preparing bootsteps.
[2020-02-21 12:39:03,420: DEBUG/MainProcess] | Worker: Building graph...
[2020-02-21 12:39:03,421: DEBUG/MainProcess] | Worker: New boot order: {StateDB, Beat, Timer, Hub, Pool, Autoscaler, Consumer}
[2020-02-21 12:39:03,429: DEBUG/MainProcess] | Consumer: Preparing bootsteps.
[2020-02-21 12:39:03,429: DEBUG/MainProcess] | Consumer: Building graph...
[2020-02-21 12:39:03,447: DEBUG/MainProcess] | Consumer: New boot order: {Connection, Events, Mingle, Gossip, Tasks, Control, Agent, Heart, event loop}

 -------------- celery@matador-B450M-DS3H v4.4.0 (cliffs)
--- ***** ----- 
-- ******* ---- Linux-4.15.0-70-generic-x86_64-with-debian-buster-sid 2020-02-21 12:39:03
- *** --- * --- 
- ** ---------- [config]
- ** ---------- .> app:         TheRodeoProject:0x7f00682ecc10
- ** ---------- .> transport:   redis://localhost:6379//
- ** ---------- .> results:     redis://localhost:6379/
- *** --- * --- .> concurrency: 12 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . TheRodeoProject.celery.debug_task
  . celery.accumulate
  . celery.backend_cleanup
  . celery.chain
  . celery.chord
  . celery.chord_unlock
  . celery.chunks
  . celery.group
  . celery.map
  . celery.starmap

[2020-02-21 12:39:03,455: DEBUG/MainProcess] | Worker: Starting Hub
[2020-02-21 12:39:03,455: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:03,455: DEBUG/MainProcess] | Worker: Starting Pool
[2020-02-21 12:39:03,891: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:03,891: DEBUG/MainProcess] | Worker: Starting Consumer
[2020-02-21 12:39:03,891: DEBUG/MainProcess] | Consumer: Starting Connection
[2020-02-21 12:39:03,900: INFO/MainProcess] Connected to redis://localhost:6379//
[2020-02-21 12:39:03,901: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:03,901: DEBUG/MainProcess] | Consumer: Starting Events
[2020-02-21 12:39:03,908: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:03,908: DEBUG/MainProcess] | Consumer: Starting Mingle
[2020-02-21 12:39:03,908: INFO/MainProcess] mingle: searching for neighbors
[2020-02-21 12:39:04,924: INFO/MainProcess] mingle: all alone
[2020-02-21 12:39:04,924: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:04,925: DEBUG/MainProcess] | Consumer: Starting Gossip
[2020-02-21 12:39:04,930: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:04,930: DEBUG/MainProcess] | Consumer: Starting Tasks
[2020-02-21 12:39:04,934: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:04,934: DEBUG/MainProcess] | Consumer: Starting Control
[2020-02-21 12:39:04,935: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:04,935: DEBUG/MainProcess] | Consumer: Starting Heart
[2020-02-21 12:39:04,936: DEBUG/MainProcess] ^-- substep ok
[2020-02-21 12:39:04,936: DEBUG/MainProcess] | Consumer: Starting event loop
[2020-02-21 12:39:04,937: DEBUG/MainProcess] | Worker: Hub.register Pool...
[2020-02-21 12:39:04,937: WARNING/MainProcess] /home/matador/anaconda3/envs/venv1/lib/python3.7/site-packages/celery/fixups/django.py:203: UserWarning: Using settings.DEBUG leads to a memory
            leak, never use this setting in production environments!
  leak, never use this setting in production environments!''')
[2020-02-21 12:39:04,937: INFO/MainProcess] celery@matador-B450M-DS3H ready.

Как видите, задача, которую я хотел добавить в свою очередь, не появляется, когда я запускаю эту команду. В остальном вроде нормально.

РЕДАКТИРОВАТЬ:

Кажется, решение этой проблемы состоит в том, чтобы использовать бит сельдерея вместо обычного сельдерея.


person chenard612    schedule 20.02.2020    source источник
comment
Не могли бы вы попробовать другой способ добавить задачу в планировщик: app.conf.beat_schedule = { 'Очистить просроченные результаты на бэкенде Celery': { 'task': 'celery.backend_cleanup', 'schedule': crontab(hour=4, minute =0), } }   -  person frost-nzcr4    schedule 21.02.2020


Ответы (1)


Вероятно, вам нужно запустить рабочий процесс сельдерея.

celery -A proj worker -l debug
person schillingt    schedule 20.02.2020
comment
Я пробовал это раньше, но я не уверен, что делать с результатами. Я получаю то, что в основном выглядит как функция --help со списком команд. Моя задача не проходит, хотя. - person chenard612; 21.02.2020
comment
Что ты имеешь в виду? - person schillingt; 21.02.2020
comment
Я получаю длинный список таких команд и опций: использование: celery ‹команда› [опции] Позиционные аргументы: args необязательные аргументы: -h, --help и т. д. Я не вижу ничего, что подтверждало бы, что задача будет выполнена. Готово. - person chenard612; 21.02.2020
comment
Можете ли вы отредактировать свой пост и включить эту команду и ее вывод? У меня такое чувство, что это не то же самое, что я предложил. - person schillingt; 21.02.2020
comment
$ celery -A proj -l использование отладки: celery ‹команда› [опции] Показать экран справки и выйти. позиционные аргументы: args необязательные аргументы: -h, --help показать это справочное сообщение и выйти --version показать номер версии программы и выйти ... Глобальные параметры: -A APP, --app APP -b BROKER, --broker BROKER и т. д. Это продолжается намного дольше, чем это - person chenard612; 21.02.2020
comment
Вам нужно worker там. celery -A TheRodeoProject worker -l debug - person schillingt; 21.02.2020
comment
Большое спасибо, Шиллингт, я действительно забыл «рабочего» в своей строке кода. Когда я запускаю «celery -A proj worker -l debug», я получаю много синего текста, но моя задача все еще не указана как задача, которую нужно выполнить. Я отредактирую свой вопрос, чтобы вам было легче увидеть, что я получаю. Спасибо еще раз. - person chenard612; 21.02.2020
comment
Вы можете видеть, что он принимает TheRodeoProject.celery.debug_task. В чем разница между этим и тем, который вы хотите запустить? - person schillingt; 21.02.2020
comment
Думаю, я ожидал, что эта задача будет называться «team_accountability», точно так же, как та, что оформлена в моем task.py. Если ''TheRodeoProject.celery.debug_task'' означает, что мои задачи обнаруживаются сельдереем и выполняются, тогда я должен исправить свою ''team_accoutnability' - person chenard612; 21.02.2020
comment
Я просто указываю, что что-то в вашем проекте несколько работает. Вы должны исследовать это и определить различия. Надеюсь, ваш ответ где-то на этом пути. - person schillingt; 21.02.2020