【发布时间】: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