gpt4 book ai didi

python - Django Celery 教程不返回结果

转载 作者:太空狗 更新时间:2023-10-29 17:59:50 32 4
gpt4 key购买 nike

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

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

最佳答案

我从另一个 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 教程在它们的教程中省略了这些行。

关于python - Django Celery 教程不返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6854133/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com