2011-07-28 79 views
11

UDATE3:发现问题。请参阅下面的答案。Django芹菜教程不返回结果

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

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

原贴:

我试图让Django的芹菜启动和运行。我无法通过这个例子。

我成功地安装的RabbitMQ并通过教程去没有麻烦:http://www.rabbitmq.com/getstarted.html

然后我试图去通过djcelery教程。

当我运行python manage.py celeryd -l info我得到的消息: [任务] - app.module.add [2011-07-27 21时十七分19秒,990:警告/ MainProcess]芹菜@红杉已经开始。

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

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(),它只是挂起。我究竟做错了什么?

UPDATE:这是运行在前台记录仪说,当我开始了工作服务器:

No handlers could be found for logger “multiprocessing” 

[Configuration] 
- broker:  amqplib://[email protected]: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] [email protected] 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’ 

如何获得th是否需要正确注册和处理任务?谢谢。

更新2:

此链接建议没有登记错误可能是由于客户和员工之间的任务名称不匹配 - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

退出manage.py壳,进入了蟒蛇壳进入以下:

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

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

+0

您使用的是Windows吗?有报告显示在Celery中没有Windows的结果3 – asksol

+0

是的,我正在使用windows。我即将重新审视利用rabbitmq和芹菜的项目。那么我会记住你的意见。总的来说,我对这两者都非常满意。 – sequoia

回答

14

我发现从另一个计算器后解决我的问题: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-celery教程在他们的教程中省略了这些行。

+1

我不敢相信他们在django芹菜文档中省略了这些关键的关键行..... – Tony

+2

@Tony在http://docs.celeryproject.org/en/latest/django/first- steps-with-django.html #define-and-calling-tasks这不是一个问题,除非你使用相对导入,并且在Python中不鼓励相对导入 – asksol

+0

我有类似的问题,并且相对导入是否与它有关,CELERY_RESULT_BACKEND ='amqp'位是必需的。 – CrazyCasta

4

如果您运行在调试模式芹菜更容易理解的问题

python manage.py celeryd 

什么芹菜日志说,芹菜接到任务? 如果没有则可能是代理(?错了队列)

给我们更多的细节问题,这样我们就可以帮您

+0

存储的日志文件在哪里?我找不到它。会不会是rabbitmq日志?或其他?我把前面的记录器的文本添加到我的文章上面。谢谢。 – sequoia