芹菜 - 相同的参数,多次调用

时间:2011-12-10 03:20:51

标签: python celery

要么我不明白Celery是如何运作的,要么对我来说很奇怪。

我有以下daemon.py模块:

    来自celery.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。

我做错了吗?或者我不明白应该如何使用芹菜?

Python 2.7,Celery 2.4.5,Celery配置:

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

1 个答案:

答案 0 :(得分:1)

当你调用这样的函数时:

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

r是一个AsyncResult对象,可让您检索任务的结果。您可以调用get方法阻止,直到任务完成并返回结果。如果您想检查任务是否已完成而没有阻止,您也可以定期致电ready

如果要检查任务的结果而不再引用AsyncResult对象,可以按照here所示的任务ID查找它:

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