【问题标题】:celery - same parameters, multiple invocationscelery - 相同的参数,多次调用
【发布时间】:2012-01-17 06:06:24
【问题描述】:

要么我不明白Celery 的工作原理,要么它对我来说很奇怪。

我有以下 daemon.py 模块:

from 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 是 different 调用和 different 结果比 r。

我做错了吗?还是我不明白芹菜应该怎么用?

Python 2.7、Celery 2.4.5、Celery 配置:

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

【问题讨论】:

  • 为什么会返回之前的异步结果?是什么让你这么想?
  • celeryproject.org/tutorials/first-steps-with-celery 让我这么想,但似乎我误解了。那么,我怎样才能得到我从例如开始的 10 分钟任务的结果。以前的网络运行?

标签: python celery


【解决方案1】:

当你调用这样的函数时:

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

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

如果你想检查一个任务的结果并且你不再有AsyncResult对象的引用,你可以通过它的任务ID来查找它,如here所示:

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

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 2019-05-15
    • 2015-10-07
    • 2021-06-05
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多