Celery docs解释了如何设置事件的自定义处理。然而,这种方法似乎与我的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)
我刚刚从文档中复制了示例监视器。
我没有收到任何错误,但启动芹菜工作者/ beat或者django的runserver似乎暂停,直到我发表my_monitor(app)
行注释。
在Django项目中执行此操作的正确方法是什么?
答案 0 :(得分:1)
我建议使用芹菜 - flower来做到这一点。
Flower启动龙卷风WebSocket服务器,并将结果和任务状态传递给API WebSocket端点。
请在下面找到Django事件模板的示例
{% extends "admin/base.html" %}
{% load staticfiles %}
{% block extrastyle %}
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
}
</style>
{% endblock extrastyle %}
{% block extrahead %}
<title>Read Flower event Websocket-API</title>
<script language="javascript" type="text/javascript">
var ws_success = new WebSocket('ws://localhost:5555/api/task/events/task-succeeded/');
ws_success.onmessage = function (event) {
var div = document.getElementById("output");
var li = document.createElement('li');
li.innerText = event.data;
div.appendChild(li);
}
</script>
{% endblock extrahead %}
{% block content %}
<h2>Events:</h2>
<ul>
<div id="output"></div>
</ul>
{% endblock content %}
django模板使用以下端点:
ws://localhost:5555/api/task/events/task-succeeded/
或者可以使用第二个WebSocket端点:
ws://localhost:5555/dashboard
用&#34; pipenv&#34;安装它(优于pip and virtualenv):
pipenv install flower
开始花:
flower -A $projectname -l info
和芹菜工人有花的事件信息:
celery -A $projectname worker -E -B -l info
请参阅celery heartbeat和celery command line options for heartbeat and events。 Celery beat periodic是任务调度程序,将以&#34; -E&#34;选项。
在以下文件中配置celery后启动Django项目:
如celery configuration中所述。
答案 1 :(得分:1)
recv.capture是一个阻止调用。你从事件处理程序那里得到了什么输出吗?
如果您尝试将django服务器用作监视器和任务生产者/消费者,则无法正常工作。
您的显示器应该是一个单独的独立应用程序。你也应该考虑消除django依赖,因为它是不必要的。