我是celery的新手,我有一个" celery-server",就像下面的代码一样,会在一段时间后返回结果,具体取决于计算。我已经使用sleep函数在下面这个简单的程序中模拟了这种行为。我想要的是在重大结果之前处理早期返回的结果"。我写了一个简单的程序,见下面的剪辑,它故意创建了#34;重载"任务作为第一个电话。 请注意,后续调用会创建更轻松的"任务,因此芹菜服务器提前返回它们。因此,我想根据它们到达客户端的顺序处理返回的结果。现在(请参阅客户端代码),它等待重任务返回。
但是使用来自芹菜文档的示例,我应该通过检查id或者对它们进行轮询来等待结果(这是愚蠢的,因为芹菜客户端必须检查"第一个"以某种方式到达结果我猜)。
如何根据芹菜到达客户的顺序处理芹菜的结果?我不想在无休止的循环中轮询" result.ready()"因为这完全搞砸了恕我直言,不知何故的异步处理感。
在文档中找不到解决方案。我想要做的是"首先到达结果并获得id",将其与我的" result.id"进行比较。 (我发送任务了吗?)然后进行相应的处理。
#
# Name this code "tasks.py" and run it with:
# celery worker -A tasks --loglevel=info
#
from celery import Celery
import time
app = Celery('tasks', backend='amqp', broker='amqp://guest:guest@127.0.0.1:5672/%2F')
@app.task()
def add(x,y):
print("x=%s y=%s" % (x,y))
time.sleep(x)
return x + y
第二个程序客户端:这就像芹菜文档一样,但是芹菜已经完成了0,1,2(因此客户端应该使用它)。
#!/usr/bin/python3
from tasks import add
results = []
max = 4
for i in range(0,max):
print(max-(i+1))
result = add.delay(max-(i+1),0)
results.append(result)
print("")
for i in range(0,max):
result = results[i].get(timeout=10)
print(result)
结果:(最后4个数字应出现在抵达顺序中,即0,1,2,3)
3
2
1
0
3
2
1
0