处理Celery任务会导致到达订单

时间:2015-09-11 05:42:08

标签: python rabbitmq celery amqp

我是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

0 个答案:

没有答案