Python Celery异步任务

时间:2015-11-10 21:43:55

标签: python celery

我使用RabbitMQ 3.5.6运行Python 2.7.10和Celery 3.1.19。

我担心我不了解Celery的工作原理。这是我的tasks.py文件:

from celery import Celery
app = Celery('tasks', backend='rpc://', broker='amqp://guest@localhost//')

@app.task
def add(a, b):
    return a + b

以下是我演奏的成绩单:

In [20]: res0 = add.delay(1,2)

In [21]: res0.ready()
Out[21]: True

In [22]: res0.get()
Out[22]: 3

In [23]: res1 = add.delay(2,3)

In [24]: res1.ready()
Out[24]: True

In [25]: res1.get()
Out[25]: 5
--- try in a different order ----
In [26]: res0 = add.delay(1,2)

In [27]: res1 = add.delay(2,3)

In [28]: res0.ready()
Out[28]: True

In [29]: res1.ready()
Out[29]: False

In [30]: res0.get()
Out[30]: 3

我认为Celery可以异步运行任务?为什么add两个都在顶部工作,而不是在底部工作?我一定是在误解或误解芹菜。有人可以帮助我吗?

感谢您的帮助!

更新

另一个与此相关的成绩单。当你检查发生的事情时,Celery量子机械是什么状态只会崩溃?!我很困惑!

In [12]: res0 = add.delay(1,2)

In [13]: res1 = add.delay(2,3)

In [14]: res0.ready()
Out[14]: True

In [15]: res1.ready()
Out[15]: False

In [16]: res0.result
Out[16]: 3
--- another try ----
In [17]: res0 = add.delay(1,2)

In [18]: res1 = add.delay(2,3)

In [19]: res1.ready()
Out[19]: True

In [20]: res0.ready()
Out[20]: False

In [21]: res1.result
Out[21]: 5

1 个答案:

答案 0 :(得分:2)

看起来我偶然发现了Celery的一个角落,大多数人都不认为这个角落会进入,但就在这里。事实证明,如果你不使用rpc://后端,而是使用对RabbitMQ的显式引用,它可以工作:

# this works
app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')

rpc://方法在official docs here中给出,但这是一个破碎的例子。所以 - 如果你想要真正的异步行为,不要使用rpc://