在 aiohttp 或 httpx 中,我需要在应用程序关闭时关闭会话/客户端吗

and*_*nik 2 python httprequest aiohttp fastapi httpx

我正在使用httpx库,但我认为aiohttp的原理是相同的。如果我在应用程序的整个生命周期中为多个请求创建并重用 AsyncClient,我是否需要在应用程序关闭事件时调用aclose()(或者如果使用 Client)?close或者这些联系会自行消失。

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

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

感谢帮助。

lsa*_*abi 5

startup我建议您使用和上的触发器shutdown。它们在文档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()
Run Code Online (Sandbox Code Playgroud)

编辑

抱歉,误解了问题。

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

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

尽管这是数据库连接而不是 HTTP 连接的情况,但关闭所有未使用的连接始终是一个好习惯,因为操作系统可能会延迟注意到打开端口的正在运行的进程并终止它。因此,您的应用程序(或您拥有的任何应用程序)将被停止,但该进程在一段时间后仍在运行。

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