我一直在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'
我发现这很奇怪,因为我认为任务已经完成。我仔细检查了ids以确保。
看起来客户端配置为使用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
答案 0 :(得分:2)
原来这是一个Windows问题。为了诚实,我应该说我从这里得到答案:Celery 'Getting Started' not able to retrieve results; always pending
基本上,将worker传递给--pool = solo flag:
> C:\Python27\Scripts\celery.exe -A messaging.tasks worker --loglevel=info --pool=solo
我不确定池实现控制了什么。