异步资源管理核心是try-finally配合await清理,资源声明在try外、finally中await关闭;推荐async with(需实现__aenter__/__aexit__);需响应取消并重抛cancellederror;服务退出时按依赖顺序超时清理。

核心是用 try-finally 结构配合异步清理操作,确保无论成功、失败还是被取消,资源都能释放。
try-finally 是最可靠的基础结构
把资源获取放在 try 块外或开头,清理逻辑写在 finally 中。这样即使 await 后抛出异常、被 cancel() 中断,finally 仍会执行。
- 资源声明必须在 try 外,否则 finally 访问不到
- finally 里的清理操作要用 await,比如
await file.close()或await conn.aclose() - 清理函数最好设计成幂等的——多次调用不报错,避免重复释放引发问题
用 async with 管理上下文更简洁
只要类实现了 __aenter__ 和 __aexit__,就能用 async with 自动处理生命周期。
-
__aenter__负责异步获取资源(如建连、加锁) -
__aexit__接收exc_type、exc_value、traceback,可判断是否发生了异常,并执行关闭、解锁等操作 - 返回 None 或 False 表示不压制异常;返回 True 才会吞掉异常(一般不推荐)
任务取消时也要响应清理
当协程被 task.cancel() 中断,会在下一个 await 点抛出 CancelledError,这时需捕获并做清理。
- 在 try 块中 await 长耗时操作,except 捕获 CancelledError
- 清理完成后,通常要 重新 raise,以确认取消状态被上层感知
- 别忘了 finally 里再补一层保障——比如关闭连接、释放锁,防止漏掉
服务退出阶段统一协调资源
整个应用关闭时,不能只靠单个函数,得有全局信号监听和等待机制。
- 监听
SIGTERM或SIGINT,触发关闭流程 - 停止接收新请求,但允许正在运行的协程完成
- 用
asyncio.wait_for给清理留出合理超时,避免无限等待 - 按依赖顺序释放:先停 worker,再关数据库连接,最后释放文件句柄或事件监听器











