【问题标题】:Django Celery tutorial not returning resultsDjango Celery 教程不返回结果
【发布时间】:2011-10-14 19:28:06
【问题描述】:

UDATE3: 发现了问题。请参阅下面的答案。

UPDATE2: 看来我可能一直在通过 manage.py shell 运行 djcelery 教程来处理自动命名和相关导入问题,见下文。它仍然对我不起作用,但现在我收到新的日志错误消息。见下文。

更新:我在帖子底部添加了日志。示例任务好像没有注册?

原帖:

我正在尝试让 django-celery 启动并运行。我无法通过示例。

我成功安装了rabbitmq并顺利完成了教程:http://www.rabbitmq.com/getstarted.html

然后我尝试阅读 djcelery 教程。

当我运行python manage.py celeryd -l info 时,我收到消息: [任务] - app.module.add [2011-07-27 21:17:19, 990: WARNING/MainProcess] celery@sequoia 已经启动。

所以看起来不错。我把它放在我的设置文件的顶部:

import djcelery
djcelery.setup_loader()

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

将这些添加到我安装的应用程序中:

'djcelery',

这是我的应用任务文件夹中的 tasks.py 文件:

from celery.task import task

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

我将此添加到我的 django.wsgi 文件中:

os.environ["CELERY_LOADER"] = "django"

然后我在命令行输入这个:

>>> from app.module.tasks import add
>>> result = add.delay(4,4)
>>> result
(AsyncResult: 7auathu945gry48- a bunch of stuff)
>>> result.ready()
False

看起来它有效,但问题是:

>>> result.result
>>>               (nothing is returned)
>>> result.get()

当我输入 result.get() 时,它会挂起。我做错了什么?

更新:当我启动工作服务器时,这就是在前台运行记录器的内容:

No handlers could be found for logger “multiprocessing”

[Configuration]
- broker:      amqplib://guest@localhost:5672/
- loader:      djcelery.loaders.DjangoLoader
- logfile:     [stderr]@INFO
- concurrency: 4
- events:      OFF
- beat:        OFF

[Queues]
- celery:      exchange: celery (direct)  binding: celery

[Tasks]
 - app.module.add
[2011-07-27 21:17:19, 990: WARNING/MainProcess] celery@sequoia has started.

 C:\Python27\lib\site-packages\django-celery-2.2.4-py2.7.egg\djcelery\loaders.py:80:  UserWarning: Using settings.DEBUG leads to a memory leak, neveruse this setting in production environments!
     warnings.warn(“Using settings.DEBUG leads to a memory leak, never”

然后当我输入命令时:

>>> result = add(4,4)

这出现在错误日志中:

[2011-07-28 11:00:39, 352: ERROR/MainProcess] Unknown task ignored: Task of kind ‘task.add’ is not registered, please make sure it’s imported. Body->”{‘retries’: 0, ‘task’: ‘tasks.add’, ‘args’: (4,4), ‘expires’: None, ‘ta’: None
    ‘kwargs’: {}, ‘id’: ‘225ec0ad-195e-438b-8905-ce28e7b6ad9’}”
Traceback (most recent call last):
   File “C:\Python27\..\celery\worker\consumer.py”,line 368, in receive_message
      Eventer=self.event_dispatcher)
   File “C:\Python27\..\celery\worker\job.py”,line 306, in from_message 
       **kw)
   File “C:\Python27\..\celery\worker\job.py”,line 275, in __init__
       self.task = tasks[self.task_name]
   File “C:\Python27\...\celery\registry.py”, line 59, in __getitem__
       Raise self.NotRegistered(key)
NotRegistered: ‘tasks.add’   

如何正确注册和处理此任务?谢谢。

更新 2:

此链接表明未注册错误可能是由于客户端和工作人员之间的任务名称不匹配 - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

退出manage.py shell,进入python shell,输入如下:

>>> from app.module.tasks import add
>>> result = add.delay(4,4)
>>> result.ready()
False
>>> result.result
>>>                 (nothing returned)
>>> result.get()
                    (it just hangs there)

所以我得到了相同的行为,但是新的日志消息。从日志中可以看出,服务器正在工作,但它不会反馈结果:

[2011-07-28 11:39:21, 706: INFO/MainProcess] Got task from broker: app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3]
[2011-07-28 11:39:21, 706: INFO/MainProcess] Task app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3] succeed in 0.04600000038147s: 8

所以服务器得到了任务并计算了正确的答案,但它不会发回?为什么不呢?

【问题讨论】:

  • 您使用的是 Windows 吗?有报告称 Celery 3 在 Windows 中无法正常工作
  • 是的,我正在使用 Windows。我即将重新审视使​​用 rabbitmq 和 celery 的项目。我会记住你的cmets。总的来说,我对这两个很满意。

标签: python django rabbitmq celery


【解决方案1】:

我从另一个 stackoverflow 帖子中找到了我的问题的解决方案:Why does Celery work in Python shell, but not in my Django views? (import problem)

我必须将这些行添加到我的设置文件中:

CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("app.module.tasks", )

然后在 task.py 文件中,我将任务命名为:

@task(name="module.tasks.add")

必须将任务名称告知服务器和客户端。 celery 和 django-celery 教程在他们的教程中省略了这些行。

【讨论】:

  • 我不敢相信他们在 django celery 文档中忽略了这些关键的关键行.....
  • @Tony 请参阅下面关于相对导入的注释docs.celeryproject.org/en/latest/django/… 除非您使用相对导入,否则这不是问题,并且在 Python 中不鼓励相对导入
  • 我遇到了类似的问题,无论相对导入是否与它有关,CELERY_RESULT_BACKEND = 'amqp' 位是必要的。
【解决方案2】:

如果你在调试模式下运行 celery 更容易理解问题

python manage.py celeryd

celery 日志说什么,celery 正在接收任务? 如果不是,可能是代理有问题(错误的队列?)

给我们更多的细节,这样我们可以帮助你

【讨论】:

  • 日志文件存放在哪里?我找不到它了。会是rabbitmq日志吗?或其他?我将在前台运行记录器的文本添加到我上面的帖子中。谢谢。
猜你喜欢
  • 2015-11-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2021-02-25
  • 1970-01-01
  • 2017-09-08
相关资源
最近更新 更多