我使用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
答案 0 :(得分:2)
看起来我偶然发现了Celery的一个角落,大多数人都不认为这个角落会进入,但就在这里。事实证明,如果你不使用rpc://
后端,而是使用对RabbitMQ的显式引用,它可以工作:
# this works
app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')
rpc://
方法在official docs here中给出,但这是一个破碎的例子。所以 - 如果你想要真正的异步行为,不要使用rpc://
!