无法从Celery队列中获取结果

时间:2014-10-29 16:42:10

标签: python celery

我一直在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

1 个答案:

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

我不确定池实现控制了什么。