使用带redis的django-celery时出现NotRegistered异常

pat*_*ide 6 python django celery django-celery

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

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'
Run Code Online (Sandbox Code Playgroud)

更新:
我的任务定义:

from celery.task import task
@task
def add(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

ask*_*sol 5

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

用芹菜开始

celery worker -l info
Run Code Online (Sandbox Code Playgroud)

要查看已注册任务的列表,请确保列出的所需任务具有完全相同的名称.

在这里看到为什么这是重要的原因,和一些常见原因: http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-names ,特别是: HTTP://docs.celeryproject.组织/ EN /最新/ userguide /参见tasks.html#自动命名和后相对进口

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

ps auxww | awk ' /celeryd/ {print $2}' | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

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

在将来,您应该确保不使用--pidfileceleryd 的参数在新旧工作者之上启动新工作程序.

@ linux-warrior:实际上,任务装饰器通过使用一些黑魔法来支持两种调用(与父母一起或不使用)