【问题标题】:FastAPI: Optimal way of sending multiple requests from an APIFastAPI:从 API 发送多个请求的最佳方式
【发布时间】:2021-07-12 06:23:28
【问题描述】:

我必须为向其他 API 发送多个请求并将其响应合并为输出的 API 提供服务。

最理想的方法是什么?这是一些异步等待场景吗?感谢您的建议。

from fastapi import FastAPI
import requests

app = FastAPI()

@app.post('/api')
def main_api():
    JScontent = json.loads(request.json())
    input = JScontent['content']
    response1 = requests.post(url1, json={"input":input})
    response2 = requests.post(url2, json={"input":input})
    response3 = requests.post(url3, json={"input":input})
    response4 = requests.post(url4, json={"input":input})

    prediction = fuse_responses(response1, response2, response3, response4)
    return prediction

我目前正在使用 Flask 进行开发,但认为它可能没有能力,或者管理这样的场景会很麻烦,因此,愿意更改为 FastAPI。

[更新]

有没有发现这个link。我想它可以类似地应用于 FastAPI 吗?我之前没有异步和等待方面的经验,因此感谢您的验证。

from fastapi import FastAPI


app = FastAPI()

async def send_requests(url, input_):
    res = await app.post(url, input_)
    return res
    

@app.post('/api')
async def main_api():
    JScontent = json.loads(request.json())
    input_ = JScontent['content']

    res1 = await send_requests(url1, input_)
    res2 = await send_requests(url2, input_)
    res3 = await send_requests(url3, input_)
    res4 = await send_requests(url4, input_)

    prediction = fuse_responses(res1, res2, res3, res4)
    return prediction

【问题讨论】:

  • 我猜你可以为每个请求创建一个线程。但请不要将您的变量命名为input。 input 是 python 的内置函数。
  • 你能举个例子吗?对不起,这仍然是菜鸟〜在输入上注明,我只是使用伪代码作为一个简单的例子
  • 这里有一些示例可以帮助您入门:stackoverflow.com/questions/15752973/…

标签: python async-await fastapi


【解决方案1】:

多个微服务调用的聚合可以通过上述两种框架中的聚合模式来完成。

FAST API 是一个用于构建 API 的高性能、异步、非阻塞框架,这类似于 Javascript 全栈世界中的节点框架。您绝对可以在每个 API 调用上使用异步回调,并在获得结果后聚合它们。与 FLASK 相比,FAST API 快得惊人。如果您需要高性能系统,FAST API 可能是一个不错的选择。话虽如此,请始终记住,您的 API 将与 API 链中的最低分母一样高效。 查看文档:https://fastapi.tiangolo.com/advanced/openapi-callbacks/

Flask 是一个可靠的、经过时间考验的、与 python 同步的 API 框架。多家企业已使用烧瓶来构建 API。除非使用显式线程管理,否则所有编写的代码都将按顺序执行。

https://creativedata.stream/multi-threading-api-requests-in-python/

如果您需要其他帮助或有疑问,请回复。

【讨论】:

  • 我更倾向于对代码更友好的东西,然后在 Flask 中手动编写多线程。我查看了您提供的 FastAPI 文档,该页面似乎更关注基于回调创建 openapi 文档,而不是发送多个请求。我刚刚用异步等待更新了我的帖子,例如,你认为这段代码能按我的预期工作吗?
  • 如果您不确定它是否能正常工作,只需对其进行测试。如果您收到 500 或 4xx 错误,您就知道出了问题。
【解决方案2】:

是的,使用asynchronous 功能是处理此类问题的正确方法。

不过,您要实现的目标称为AGGREGATOR PATTERN,其中一项服务接收请求并调用所有不同的服务。这在微服务的情况下很常见,其中一个页面包含来自多个微服务的信息。它有时在网关中实现(又名API AGGREGATION PATTERN),但大多数时候我在专用服务中看到这种模式。

以下几个可能有用的链接:

https://docs.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation

在这里,它使用异步代码来实现您想要实现的目标

https://dzone.com/articles/microservices-aggregator-design-pattern-using-aws

注意 您始终可以从烧瓶应用程序中生成新线程来执行请求。或者,您始终可以创建一个异步函数,该函数将异步调用所有 URLs,等待它们的响应,聚合它们并返回结果。

这里有一个简短的教程,介绍如何通过同步代码运行异步代码来实现目标。

https://realpython.com/async-io-python/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多