我一直在Windows 7上玩Celery。现在,我正在学习"下一步"教程:http://docs.celeryproject.org/en/latest/getting-started/next-steps.html
我创建了一个celery.py文件:
from __future__ import absolute_import
from celery import Celery
app = Celery('proj',
broker='amqp://',
backend='amqp://',
include=['proj.tasks'])
# app.conf.update(
# CELERY_TASK_RESULT_EXPIRES=3600,
# )
if __name__ == '__main__':
app.start()
然后我创建了一个tasks.py文件:
from __future__ import absolute_import
from proj.celery import app
@app.task
def add(x, y):
return x + y
@app.task
def mul(x, y):
return x * y
@app.task
def xsum(numbers):
return sum(numbers)
然后,我在一个Powershell中解雇了一名芹菜工人。然后在另一个Powershell中,我添加了几个整数:
>>> from proj.tasks import add
>>> res = add.delay(2, 2)
在运行队列的窗口中,我马上得到了一个结果:
[2014-10-29 09:20:28,875: INFO/MainProcess] Received task: proj.tasks.add[3e5783ef-46a1-44d0-893f-0623e5bc0b09]
[2014-10-29 09:20:28,891: INFO/MainProcess] Task proj.tasks.add[3e5783ef-46a1-44d0-893f-0623e5bc0b09] succeeded in 0.016
0000324249s: 4
然而,当我尝试使用res.get()在另一个窗口中检索结果时,函数会挂起。我已经读了好几遍教程,在网上找不到问题所在。问题可能是使用amqp作为后端吗?我猜amqp将状态作为消息发送,而不是存储它们。
奇怪的是,如果我按Ctrl+C并查询res的状态,我会得到"PENDING"。
>>> res.status
'PENDING'
我觉得这很奇怪,因为我以为任务已经完成了。我仔细检查了身份证以确定。
看起来客户端被配置为使用amqp作为后端:
>>> print(res.backend)
<celery.backends.amqp.AMQPBackend object at 0x00000000035C0358>
看起来ignore_result设置为false。
>>> add
<@task: proj.tasks.add of proj:0x2298390>
>>> add.name
'proj.tasks.add'
>>> add.ignore_result
False
原来这是一个windows问题。为了诚实起见,我应该说我从这里得到了答案:芹菜';入门';无法检索结果;始终挂起
基本上,将--pool=solo标志传递给工人:
> C:Python27Scriptscelery.exe -A messaging.tasks worker --loglevel=info --pool=solo
不过,我不确定池的实现控制着什么。