在 FastAPI 中有一个长时间运行的协程可以吗?

Posted

技术标签:

【中文标题】在 FastAPI 中有一个长时间运行的协程可以吗?【英文标题】:Is it OK to have a long running coroutines in FastAPI? 【发布时间】:2021-06-24 10:25:02 【问题描述】:

FastAPI 中有 10-30 秒的协程可以吗? (在 FastApi 性能和良好实践方面)

因此,客户端将打开 10-30 秒的请求-响应。 在客户端,我们使用的是 React.js,所以对他们来说没问题。

@app.get("/somepath")
async def read_item():
    async with aiohttp.ClientSession() as session:
        # some slow external API, 10-30 seconds
        async with session.get(f"https://external.website.com/some_api_key/") as response:
            response_json = await response.json()
            return response_json

【问题讨论】:

在什么条件下可以?表现 ?用户体验? 在 FastAPI 的性能和良好实践方面 【参考方案1】:

它会起作用的。所以这边没问题。

UX)它非常适合大型工作。如果用户理解他为什么等待并且在数据准备好/失败时有明确的响应,则无需过多优化。 如果需要,您可以使用 socketio 或 sse(服务器发送的事件)实现完成百分比

Perf)您可以通过使用缓存来显着减少响应时间(从而提高性能和用户体验)。 (如果调用在缓存时有意义) 它将减少响应时间并减少对服务器的并发请求数。

【讨论】:

我很抱歉,但我们如何确保 FastApi 的请求响应打开 10-30 秒就其性能而言是可以的?那么如果我们有很多这样的协程,会不会影响主线程的性能呢? 你需要做一个基准测试。这是衡量对您的用例的影响的唯一方法。但它显然有效。【参考方案2】:

FastAPI 中有 10-30 秒的协程可以吗?

首先,这不是一个 FastAPI 问题。

您希望并行处理多少个这样的请求?很多?一些?您想限制同时运行的协程数量吗?默认情况下,asyncio 将使用尽可能多的资源。它可能是你想要的,也可能不是。如果你想限制多少协程可以同时运行并排队请求,你可能想看看asyncio.Semaphore。

关于您的问题是否是一种好的做法,这取决于您的工作流程。 Asyncio 是专门为此目的而创建的,用于长时间运行的后台任务以在应用程序执行其操作时释放它们。

现在,如果这是最适合您的情况的解决方案,如果没有清楚地了解您的应用程序正在做什么,就很难判断。如果用户在请求仍在服务器中运行时关闭浏览器会发生什么?用户不会得到关于它是否成功完成的反馈。你关心这个场景吗?如果这样做,您可以考虑使用队列并让 cronjob 在后台处理要处理的内容。

【讨论】:

以上是关于在 FastAPI 中有一个长时间运行的协程可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

lua学习之协同程序

跨多进程共享基于异步等待协程的复杂对象

Lua中的协同程序 coroutine

Lua中的协同程序 coroutine

Lua中的协同程序 coroutine

kotlin协程的生命周期与jetpack组件绑定