我正在使用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://
!