Celery的app.control.broadcast期望什么“命令”?

时间:2019-08-01 12:17:09

标签: python django celery

我认为app.control.broadcast需要一个@task,但是运行以下命令时:

app.send_task("workerTasks_supervisor.task_supervisor_test", args=[], queue='supervisor')

app.control.broadcast("workerTasks_supervisor.task_supervisor_test", args=[], queue="supervisor")

第一个成功,第二个失败:

[2019-08-01 12:10:52,260: ERROR/MainProcess] pidbox command error: KeyError('task_supervisor_test',)
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/kombu/pidbox.py", line 104, in dispatch
    reply = handle(method, arguments)
  File "/usr/local/lib/python3.5/dist-packages/kombu/pidbox.py", line 126, in handle_cast
    return self.handle(method, arguments)
  File "/usr/local/lib/python3.5/dist-packages/kombu/pidbox.py", line 120, in handle
    return self.handlers[method](self.state, **arguments)
KeyError: 'task_supervisor_test'

工人开始时

celery worker -A workerTasks_supervisor -n Supervisor --concurrency=1 --loglevel=info -Q supervisor -f /logs/celery_supervisor.log --pidfile=/logs/supervisor_pid.pid

任务本身很简单:

@app.task()
def task_supervisor_test():
    print("working")

我在做什么错? 谢谢。

2 个答案:

答案 0 :(得分:1)

您的假设是错误的。

您的第二行试图广播您尚未实现的命令,它自然会引发异常。

芹菜的美丽(包括许多其他方面)是它使您可以实现自己的commands。您可以像上面尝试的那样以编程方式执行它们,也可以通过命令行celery -A my.project.app <command> [params...]来执行它们。我建议每位Celery高级用户都应该了解这一非常强大的概念。

答案 1 :(得分:0)

好吧,这是另一套事情-您需要像这样注册它们:

from celery.worker.control import Panel

@Panel.register
def command_supervisor_test():
    print("working")