документы объясняют, как настроить пользовательскую обработку событий. Однако этот подход не совсем работает с моим проектом Django и сельдереем.
Мой файл celery.py
выглядит так
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')
# The custom monitor copied from celery docs
def my_monitor(app):
state = app.events.State()
def announce_failed_tasks(event):
state.event(event)
# task name is sent only with -received event, and state
# will keep track of this for us.
task = state.tasks.get(event['uuid'])
print('MY MON TASK FAILED: %s[%s] %s' % (
task.name, task.uuid, task.info(), ))
with app.connection() as connection:
recv = app.events.Receiver(connection,
handlers={'task-failed': announce_failed_tasks, }
)
recv.capture(limit=None, timeout=None, wakeup=True)
app = Celery('myproj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# Monitoring
my_monitor(app)
Я только что скопировал пример монитора из документации.
Я не получаю сообщения об ошибке, но запуск celery worker/beat или runserver django, похоже, зависает навсегда, пока я не прокомментирую строку my_monitor(app)
.
Как правильно это сделать в проекте Django?