NotRegistered 例外,当使用 django-celery 和 redis 时



我写了一个名为"task"的django应用程序,并将其添加到*INSTALLED_APPS*中。
然而,当我试图在 django shell 中调用它时,它引发了一个 NotRegistered 的解释。详细信息如下:

from task.tasks import add
from celery import registry
# 'task.tasks.add' is registered like below
registry.tasks  # 'task.tasks.add': <@task: task.tasks.add>
# Call add()
r = add.delay(3, 4)
r.successful()  # print "False"
################  celery debug info:    #############################
The full contents of the message body was:
{'retries': 0, 'task': 'task.tasks.add', 'args': (3, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '36d25389-7a0b-4a0a-98f8-d7a17ef9192e'}
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/site-packages/celery/worker/consumer.py", line 427, in receive_message
    eventer=self.event_dispatcher)
  File "/usr/local/lib/python2.6/site-packages/celery/worker/job.py", line 297, in from_message
    on_ack=on_ack, delivery_info=delivery_info, **kw)
  File "/usr/local/lib/python2.6/site-packages/celery/worker/job.py", line 261, in __init__
    self.task = registry.tasks[self.task_name]
  File "/usr/local/lib/python2.6/site-packages/celery/registry.py", line 66, in __getitem__
    raise self.NotRegistered(key)
NotRegistered: 'task.tasks.add'

更新:
我的任务定义:

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

我敢打赌,在工人中注册的名称与在客户端中注册的名称不同。

开始芹菜

celery worker -l info

若要查看已注册任务的列表,请确保列出的任务名称完全相同。

请参阅此处了解这很重要的原因以及一些常见原因:http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-names,特别是:http://docs.celeryproject.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports

如果您的任务以相同的名称列出,那么您可能有一个旧的仍在运行的工作线程,未使用最新代码进行更新。杀死所有正在运行的工人

ps auxww | awk ' /celeryd/ {print $2}' | xargs kill -9

(请注意,这将终止所有正在运行的任务,并且您可能无法取回它们使用 Redis 传输时(

将来,您应该确保不会在旧员工的基础上推出新员工。一个通过使用--pidfile参数来芹菜。

@linux战士:实际上,任务装饰器支持两种调用(有或没有父级(,通过使用一些黑魔法:)

我遇到了同样的问题。这很愚蠢,但就我而言,问题出在 .pyc 文件中。

所以find . -name '*.pyc' -delete和芹菜工人的重新启动解决了我的问题。

我希望这个答案能帮助某人。

相关内容

  • 没有找到相关文章

最新更新