Python Celery异步任务



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

恐怕我就是不明白芹菜是怎么工作的。这是我的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

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

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

这里的官方文档中给出了rpc://方法,但它是一个不完整的例子。所以,如果您想要真正的异步行为,就不要使用rpc://

相关内容

  • 没有找到相关文章

最新更新