celery - 相同参数,多次调用

1 投票
1 回答
557 浏览
提问于 2025-04-17 08:05

我不知道是我没搞懂Celery是怎么工作的,还是它对我来说太奇怪了。

我有一个叫daemon.py的模块:

from celery.task import task

import time


@task
def add(x, y):
    time.sleep(x + y)
    return "x+y=%s" % (x + y)

我用这个命令启动了celeryd:

$ celeryd -I daemon -l DEBUG       

然后在一个单独的Python控制台里,我做了以下操作:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from daemon import add
>>> r = add.delay(100,20)
>>> r
<AsyncResult: 016a6eac-333c-4606-9f3c-ea3b38dac0ea>

我本以为当我重复执行add.delay(100, 20)时,它不会再调用另一个add函数,而是会给我返回当前正在运行的daemon.add的AsyncResult。但是:

 >>> r2 = add.delay(100,20)
 >>> r2.ready()
 False
 >>> r.ready()
 True

所以显然r2是一个不同的调用,和r的结果不同

我是不是做错了什么?还是我不明白Celery应该怎么用?

Python 2.7,Celery 2.4.5,Celery配置:

BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_RESULT_BACKEND = "amqp"
REDIS_HOST = "localhost"

1 个回答

1

当你这样调用一个函数时:

>>> from daemon import add
>>> r = add.delay(100,20)
>>> r
<AsyncResult: 016a6eac-333c-4606-9f3c-ea3b38dac0ea>

r 是一个叫做 AsyncResult 的对象,它可以让你获取任务的结果。你可以使用 get 方法,这样会让程序等待,直到任务完成,然后返回结果。如果你想不阻塞程序地检查任务是否完成,可以定期调用 ready 方法。

如果你想查看一个任务的结果,但已经没有 AsyncResult 对象的引用了,你可以通过任务的 ID 来查找结果,具体方法可以参考 这里

>>> from daemon import add
>>> r = add.AsyncResult('016a6eac-333c-4606-9f3c-ea3b38dac0ea')
>>> r.get()

撰写回答