在 aiohttp 或 httpx 中,我是否需要在应用程序关闭时关闭 session/client

In aiohttp or httpx do I need to close session/client on application shutdown

我用的httpx library but I think the principle for aiohttp是一样的。 如果我在应用程序的整个生命周期中为多个请求创建并重用 AsyncClient,我是否需要在应用程序关闭事件中调用 aclose()(或 close,如果使用客户端)?或者这些连接会自行消失。

如果我 运行 应用程序在 Docker 容器中怎么办?这也会是一个因素吗?

我不明白 AsyncClient 或 Client(或 aoihttp 中的 ClientSession)对象下面发生了什么。

感谢您的帮助。

我建议您使用 startupshutdown 上的触发器。它们在文档 https://fastapi.tiangolo.com/advanced/events/#events-startup-shutdown.

中有描述

下面是对文档中示例的改编:

from fastapi import FastAPI
import httpx

app = FastAPI()

items = {}
client = None


@app.on_event("startup")
async def startup_event():
    items["foo"] = {"name": "Fighters"}
    items["bar"] = {"name": "Tenders"}
    client = httpx.AsyncClient()

@app.on_event("shutdown")
async def shutdown_event():
    items["foo"] = {"name": "Fighters"}
    items["bar"] = {"name": "Tenders"}
    await client.aclose()

编辑

抱歉,我误解了问题。

无论如何,正如@Klaus D 评论的那样,系统应该终止保持打开端口的子进程(如果生成了很多子进程)。

根据我的经验,情况可能并非总是如此,因为我记得在使用 php 编程时,我必须手动终止所有数据库连接,否则在应用程序重新启动时我会得到“进程已经使用那个端口。

虽然这是数据库连接而不是 HTTP 连接的情况,但关闭所有未使用的连接始终是一个好习惯,因为 OS 可能会延迟注意到 运行使用打开的端口处理并杀死它。因此您的应用程序(或您拥有的任何应用程序)将停止,但一段时间后该过程仍然 运行。

对 OS 的更新可能会改变进程观察器的行为并取决于 OS 本身。所以,请对我所说的持保留态度。