celery 教程:未注册错误

Posted

技术标签:

【中文标题】celery 教程:未注册错误【英文标题】:celery tutorial: NotRegistered error 【发布时间】:2013-03-20 00:58:19 【问题描述】:

我正在尝试获取 celery 的官方教程,但一直收到此错误:

D:\test>celery -A 任务工作者 --loglevel=info -------------- celery@BLR122S v3.0.17 (Chiastic Slide) ---- **** ----- --- * * * -- [配置] -- * - **** --- .经纪人:amqp://guest@localhost:5672// - ** ---------- 。应用程序:任务:0x2a76850 - ** ---------- 。并发:2(进程) - ** ---------- 。事件:关闭(启用 -E 来监视此工作人员) - ** ---------- - * --- * --- [队列] -- ******* ---- .芹菜:交换:芹菜(直接)绑定:芹菜 --- ***** ----- [任务] .任务.add [2013-03-29 17:50:52,533: 警告/MainProcess] celery@BLR122S 准备好了。 [2013-03-29 17:50:52,568:INFO/MainProcess] 消费者:连接到 amqp://guest@ 127.0.0.1:5672 //. [2013-03-29 17:51:32,496:INFO/MainProcess] 从代理获得任务:tasks.add [8345 9233-ce54-40ed-a2a8-ee0d60768006] [2013-03-29 17:51:32,562:错误/MainProcess]任务tasks.add [83459233-ce54-40ed-a 2a8-ee0d60768006] 引发异常:“tasks.add”类型的任务未注册, 请确保它已导入。 Traceback(最近一次通话最后一次):

文件“C:\Python27\lib\site-packages\billiard\pool.py”,第 293 行,在 worker 中

结果 = (True, func(*args, **kwds)) 文件“C:\Python27\lib\site-packages\celery\task\trace.py”,第 320 行,在 _fast_trace_task return _tasks[task].__trace__(uuid, args, kwargs, request)[0] 文件“C:\Python27\lib\site-packages\celery\app\registry.py”,第 20 行,在 __missing__ 提高 self.NotRegistered(key) 未注册:'tasks.add'

我安装了 celery==3.0.17 和 rabbitMQ。 然后通过“D:\test>celery -A tasks worker --loglevel=info”启动 celerytasks.add 似乎在 [Tasks] 中,但通过以下方式调用:

>>> from tasks import add
>>> add.delay(1,1)
# Out: AsyncResult: 83459233-ce54-40ed-a2a8-ee0d60768006

得到了上面的失败。有人有同样的问题吗?

编辑: 这是我从教程中复制的 tasks.py。

from celery import Celery

celery = Celery('tasks', broker='amqp://guest@localhost//')

@celery.task
def add(x, y):
    return x + y

【问题讨论】:

【参考方案1】:

有同样的问题;我通过比较我的main.py 中的PYTHONPATH 和我运行芹菜工人的控制台中的一个找到了解决方案。 tasks.py 不在 celery worker 的 PYTHONPATH 中,因此无法导入任务。

我的文件:

try_celery/tasks.py

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//', backend='redis://localhost')


@app.task
def add(x, y):
    return x + y

try_celery/main.py

from try_celery.tasks import add

if __name__ == '__main__':
    result = add.delay(4, 4)
    while not result.ready():
        pass
    print(result.get())

run_worker.sh

#!/bin/bash
PYTHONPATH=$PYTHONPATH:/<path_to_project>  # line this solved the problem
celery -A try_celery.tasks worker --loglevel=info

要执行,首先运行run_worker.sh 然后运行python3 main.py 当我从 IDE 运行我的 main.py 时,PYTHONPATH 已经更新为项目路径

【讨论】:

【参考方案2】:

以下将解决您的问题

from tasks import add
res = add.delay(1,2) #call to add 
res.get() #get result

使用

更改后重新启动您的工作人员
celery -A tasks worker --loglevel=info

【讨论】:

【参考方案3】:

先尝试导入任务,我建议你在交互式 python 环境中实现你的工作,比如 python IDE,然后你这样做:

导入任务

写之前tasks.add

【讨论】:

我编辑了我的问题。我应该把导入任务放在哪里?(PS:这也是我的第一个问题) 我解决了这个问题,但不知道为什么。如果我在 link 这样的专用文件中而不是在 shell 中运行 tasks.add,则不会出现任何错误。 我认为这是关于路径的,在你的shell中将你的项目的路径添加到环境变量中 这已经很久了,但谢谢你,我一直在做from myapp.tasks import add 并得到了同样的错误。我做了from tasks import add 并且成功了。

以上是关于celery 教程:未注册错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.9 + Celery 未注册任务

Celery 收到未注册类型的任务(运行示例)

在Python 3.7,Ubuntu 16.04中,Celery Task未注册异常

celery - 尽管已注册,但任务未运行。芹菜控制台不反映任务的接收

vb 8002801d自动化错误对象库未注册

你好,微信支付 失败 错误信息 当前页面的URL未注册 帮解决下