Celery - 完成任务但不返回结果

8 投票
3 回答
8365 浏览
提问于 2025-04-30 13:20

我刚刚安装了Celery,并试着跟着教程走:

我有一个叫做tasks.py的文件,里面有以下代码:

from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://')

@app.task
def add(x, y):
    return x + y

我安装了RabbitMQ(因为教程没有提到,所以我没有进行任何配置)。

我这样启动了celery工作服务器:

celery -A tasks worker --loglevel=info

看起来启动得很正常(这是输出的内容:https://i.stack.imgur.com/cUsap.png

然后我运行了一个脚本,内容如下:

from tasks import add
from time import sleep

result = add.delay(2,2)

while not result.ready():
    sleep(10)

当我检查result.ready()时,我总是得到False(所以上面的while循环一直在运行)。不过,在Celery的日志中,一切看起来都很好:

[2014-10-30 00:58:46,673: INFO/MainProcess] Received task: tasks.add[2bc4ceba-1319-49ce-962d-1ed0a424a2ce]
[2014-10-30 00:58:46,674: INFO/MainProcess] Task tasks.add[2bc4ceba-1319-49ce-962d-1ed0a424a2ce] succeeded in 0.000999927520752s: 4

所以任务被接收并且成功了。然而,result.ready()仍然是False。有没有人能告诉我这可能是什么原因?我在使用Windows 7,并且使用RabbitMQ。谢谢大家。

暂无标签

3 个回答

2

好的,我在一个干净的虚拟机上安装了新的celery,并设置了以下文件:

tasks.py:

from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://')

@app.task
def add(x, y):
    return x + y

还有runme.py:

from tasks import add
import time

result = add.delay(1,2)
while not result.ready():
  time.sleep(1)

print(result.get())

然后我用以下命令设置了celery:

celery -A tasks worker --loglevel=info

接着我运行了runme.py,得到了预期的结果:

[puciek@somewhere tmp]# python3.3 runme.py
3

所以很明显,问题出在你的设置上,最有可能是在rabbit-mq的安装上。我建议你重新安装最新的稳定版本,这也是我现在使用的,正如你所看到的,它运行得很好。

更新:

其实,你的问题可能简单得让人想不到——你确定你在运行celery和消费者时使用的是同一个版本吗?我刚刚复现了这个问题,我在Python3.3上运行celery,然后用2.7版本运行runme.py,结果就和你描述的一样。

5

应该能解决你的问题

ignore_result=False

撰写回答