Django芹菜教程不返回结果

2024-06-25 23:14:49 发布

您现在位置:Python中文网/ 问答频道 /正文

UDATE3:找到问题。请看下面的答案。

更新2:通过manage.py shell运行djaceleri教程,我可能已经在处理自动命名和相对导入问题,请参见下文。它仍然不适合我,但现在我得到了新的日志错误消息。见下文。

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

原帖:

我在试着让姜果芹菜开动起来。我没能通过这个例子。

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

然后我试着去学习DJcelerie教程。

当我运行python manage.py celeryd -l info时,收到消息: [任务] -app.module.add添加 【2011-07-27 21:17:1990:警告/主要流程】芹菜@红杉已经开始。

看起来不错。我把这个放在设置文件的顶部:

import djcelery
djcelery.setup_loader()

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

已将这些添加到我已安装的应用:

'djcelery',

这是我的应用程序“任务”文件夹中的my 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

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


Tags: infrompyimportaddapptaskbroker
2条回答

如果在调试模式下运行芹菜,则更容易理解问题

python manage.py celeryd

芹菜日志上怎么说,芹菜正在接受任务? 如果不是,可能是代理有问题(错误的队列?)

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

我从另一个stackoverflow post找到了解决问题的方法: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")

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

相关问题 更多 >