如何在Django中等待celery任务的结果

ebdffaop  于 2023-03-31  发布在  Go
关注(0)|答案(3)|浏览(212)

我有一个向另一个服务发送数据的celery 任务。我已经将celery 任务send_inventory_request添加到RequestSupplyStock类视图中。当我发布时,我应该首先从celery 任务中获取结果,然后继续并返回响应。我想首先等待celery 任务的结果,然后从发布方法中返回响应,这是实现此目的的正确方法。

@app.task
def send_inventory_request(payload,token):
    auth = {'authorization':token}
    HEADERS.update(auth)
    url = PROCUREMENT_SUPPLY_STOCK_REQUESTS_URL
    res = requests.post(url,json=payload,headers=HEADERS)
    inventory_request_data = res.json()
    x= logger.info('Supply Stock Request {0} + {1}'.format(payload,token))
    print(x)
    return inventory_request_data

查看

class RequestSupplyStock(generics.CreateAPIView):

      def post(self, request, format=None):
          ........

          send_inventory_request.delay(payload,get_token(request))

          .........
          return Response(status=status.HTTP_201_CREATED)
smdnsysy

smdnsysy1#

你可以用celery 等等,但不推荐
在任务中等待任务可能会导致死锁。请阅读避免启动同步子任务。

task = send_inventory_request.delay(payload,get_token(request))
result = task.wait(timeout=None, interval=0.5)
eyh26e7m

eyh26e7m2#

正如其他人已经在评论中提到的,以同步方式等待结果违背了使用celery的目的,但如果你仍然需要等待结果,那么就不要delay
只需像普通方法一样调用任务,它就会同步运行并返回结果:

send_inventory_request(payload,get_token(request))
wfsdck30

wfsdck303#

在你的问题和例子之后,我有了一些见解。但主要的问题是,它不理解项目的完整架构。
我不明白你想从什么Angular 听任务状态。

  • 你想听celery 的任务吗?

这不是正确的解决方案。所有你可以检查它是一个-任务创建并成功保存在队列中。

  • 如果你的任务更困难,需要更多的预测控制,你可以使用画布:https://docs.celeryq.dev/en/stable/userguide/canvas.html#signatures

你可以使用这个task.id,并随时检查它。

  • 如果使用flower,则会简化所有过程,因为此库具有HTTP API:https://flower.readthedocs.io/en/latest/api.html#get--api-tasks

一个解决方案,我们可以生产只知道全貌。希望我在一些帮助

相关问题