【发布时间】:2016-01-28 06:56:36
【问题描述】:
Celery docs 解释如何设置自定义事件处理。然而,这种方法似乎不太适用于我的 Django 项目和 celery。
我的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 或 django 的 runserver 似乎永远挂起,直到我注释掉 my_monitor(app) 行。
在 Django 项目中执行此操作的正确方法是什么?
【问题讨论】:
标签: django celery monitoring