在Celery Flower中发布新任务时出现“未知任务”错误

2 投票
2 回答
3730 浏览
提问于 2025-04-18 03:54

我正在使用 celery 3.1.11 和 flower 0.6.0。

我配置了一个 celery 应用,具体设置如下:

# myapp.tasks.celery.py
from __future__ import absolute_import    

from celery import Celery


class Config(object):
    BROKER_URL = 'amqp://'
    CELERY_RESULT_BACKEND = 'amqp'

    CELERY_TASK_RESULT_EXPIRES = None
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_INCLUDE = [
        'myapp.tasks.source',
        'myapp.tasks.page',
        'myapp.tasks.diffusion',
        'myapp.tasks.place',
    ]
)

celery = Celery('myapp')
celery.config_from_object(Config)    


if __name__ == '__main__':
    celery.start()

我用以下命令启动 celery 工作进程:

$ celery -A myapp.tasks worker --loglevel=INFO -E -Q celery

在工作进程的输出中,我可以看到所有可用任务的完整列表。

[tasks]
  ...    
  . myapp.tasks.diffusion.post_activity
  ...

然后,我用以下命令启动 flower 服务器:

$ celery -A myapp.tasks flower

现在,每当我尝试通过 Flower 的 REST API 提交一个新任务时,我都会收到一个 404 错误,错误信息是“未知任务 TASK_NAME”。

[W 140423 12:16:17 web:1302] 404 POST /api/task/async-apply/myapp.tasks.diffusion.post_activity (82.225.61.194): Unknown task 'myapp.tasks.diffusion.post_activity'
[W 140423 12:16:17 web:1728] 404 POST /api/task/async-apply/myapp.tasks.diffusion.post_activity (82.225.61.194) 4.68ms

我在 flower API 处理程序中设置了一个调试点,似乎在处理请求时,只有以下任务可用:

ipdb> pp celery.tasks
{'celery.backend_cleanup': <@task: celery.backend_cleanup of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.chain': <@task: celery.chain of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.chord': <@task: celery.chord of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.chord_unlock': <@task: celery.chord_unlock of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.chunks': <@task: celery.chunks of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.group': <@task: celery.group of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.map': <@task: celery.map of yoda.tasks.celery:0x7fb9191eb490>,
 'celery.starmap': <@task: celery.starmap of yoda.tasks.celery:0x7fb9191eb490>}

没有可用的任务。不过,当我在命令行中使用 async_apply() 方法时,任务可以被工作进程执行。

你觉得我哪里做错了吗?谢谢!

编辑:当我使用 celery 3.0.19 和 flower 0.5.0 时,一切都运行得很顺利。

2 个回答

0

我之前也遇到过类似的问题,使用的是flower,而我的配置是用的redis。

现在情况有所改善,因为我在启动flower的时候明确指定了“broker”这个选项的值(别问我为什么)。

在你的情况下,我会尝试

$ flower -r "amqp://"

总之,我还会确保你从一个能够正确访问所有库的环境中启动celeryredis

1

这个错误是因为Flower里面有个小 bug,现在已经修复了:

问题链接: https://github.com/mher/flower/issues/200

修复的提交记录: https://github.com/mher/flower/commit/bfba1eec90124c92586c480aebaf98ae63c31276

撰写回答