6

我编写了一个名为“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
4

2 回答 2

8

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

从 celeryd 开始

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将来,您应该确保不会通过使用celeryd的参数在旧工人之上启动新工人。

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

于 2011-12-12T11:53:13.973 回答
4

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

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

我希望这个答案会对某人有所帮助。

于 2017-02-13T09:32:34.230 回答