Django Celery 教程不返回结果

发布于 2024-11-26 14:55:46 字数 4269 浏览 2 评论 0原文

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

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

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

原始帖子:

我正在尝试启动并运行 django-celery。我无法完成这个例子。

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

我尝试阅读 djcelery 教程。

当我运行 python manage.py celeryd -l info 时,我收到消息: [任务] - 应用程序.模块.添加 [2011-07-27 21:17:19, 990: 警告/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"

然后我在命令中输入了它line:

>>> 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

退出管理.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

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

UDATE3: found the issue. See the answer below.

UPDATE2: It seems I might have been dealing with an automatic naming and relative imports problem by running the djcelery tutorial through the manage.py shell, see below. It is still not working for me, but now I get new log error messages. See below.

UPDATE: I added the log at the bottom of the post. It seems the example task is not registered?

Original Post:

I am trying to get django-celery up and running. I was not able to get through the example.

I installed rabbitmq succesfully and went through the tutorials without trouble: http://www.rabbitmq.com/getstarted.html

I then tried to go through the djcelery tutorial.

When I run python manage.py celeryd -l info I get the message:
[Tasks]
- app.module.add
[2011-07-27 21:17:19, 990: WARNING/MainProcess] celery@sequoia has started.

So that looks good. I put this at the top of my settings file:

import djcelery
djcelery.setup_loader()

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

added these to my installed apps:

'djcelery',

here is my tasks.py file in the tasks folder of my app:

from celery.task import task

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

I added this to my django.wsgi file:

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

Then I entered this at the command line:

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

So it looks like it worked, but here is the problem:

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

When I put in result.get() it just hangs. What am I doing wrong?

UPDATE: This is what running the logger in the foreground says when I start up the worker server:

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”

then when I put in the command:

>>> result = add(4,4)

This appears in the error log:

[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’   

How do I get this task to be registered and handled properly? thanks.

UPDATE 2:

This link suggested that the not registered error can be due to task name mismatches between client and worker - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

exited the manage.py shell and entered a python shell and entered the following:

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

so I am getting the same behavior, but new log message. From the log, it appears the server is working but it won't feed the result back out:

[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

So the server got the task and it computed the correct answer, but it won't send it back? why not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

久伴你 2024-12-03 14:55:46

我从另一篇 stackoverflow 帖子中找到了问题的解决方案: 为什么 Celery 在 Python shell 中工作,但在我的 Django 视图中不起作用? (导入问题)

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

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

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

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

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

I found the solution to my problem from another stackoverflow post: Why does Celery work in Python shell, but not in my Django views? (import problem)

I had to add these lines to my settings file:

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

then in the task.py file I named the task as such:

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

The server and the client had to be informed of the task names. The celery and django-celery tutorials omit these lines in their tutorials.

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

python manage.py celeryd

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

请给我们更多详细信息,这样我们可以帮助您

if you run celery in debug mode is more easy understand the problem

python manage.py celeryd

What the celery logs says, celery is receiving the task ?
If not probably there is a problem with broker (wrong queue ?)

Give us more detail, in this way we can help you

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文