Azure Function Python v2:aiohttp会话未关闭及异步Blob上传问题
解决Azure Functions Python v2中aiohttp会话未关闭与协程未等待的警告
核心问题拆解
- aiohttp会话/连接器未关闭:Azure Functions的异步执行模型中,若会话未通过正确的上下文管理完成生命周期,函数进程可能在会话关闭前被回收,触发警告。
- 协程未等待:移除Blob上传的
await会导致上传协程未被调度执行,不仅出现警告,还可能导致数据未正确写入存储。
正确实现方案
需同时满足:用async with管理aiohttp会话生命周期、使用Azure Blob存储的异步SDK、所有异步操作保留await。
完整代码示例
import azure.functions as func import aiohttp from azure.storage.blob.aio import BlobServiceClient import os async def main(req: func.HttpRequest) -> func.HttpResponse: # 初始化异步Blob服务客户端 blob_conn_str = os.getenv("AZURE_STORAGE_CONNECTION_STRING") # 1. 用async with确保aiohttp会话自动关闭 async with aiohttp.ClientSession() as session: try: # 异步调用API并获取数据 async with session.get("https://your-target-api.com/data") as resp: resp.raise_for_status() api_data = await resp.json() data_content = str(api_data) # 转换为可存储的格式 except Exception as e: return func.HttpResponse(f"API调用失败: {str(e)}", status_code=500) # 2. 异步上传Blob,全程使用await try: async with BlobServiceClient.from_connection_string(blob_conn_str) as blob_service_client: async with blob_service_client.get_container_client("your-container-name") as container_client: async with container_client.get_blob_client("target-blob.json") as blob_client: await blob_client.upload_blob(data_content, overwrite=True) except Exception as e: return func.HttpResponse(f"Blob上传失败: {str(e)}", status_code=500) return func.HttpResponse("数据获取与上传完成", status_code=200)
关键细节说明
- aiohttp会话管理:
async with aiohttp.ClientSession()会在代码块执行完毕后自动关闭会话和连接器,彻底解决未关闭警告。 - 异步Blob SDK:必须使用
azure.storage.blob.aio包,所有Blob操作(客户端初始化、上传)均为异步方法,需配合await执行。 - 上下文管理器嵌套:Blob服务客户端、容器客户端、Blob客户端都用
async with管理,确保资源自动释放,避免内存泄漏。
调试兜底措施
若本地调试仍出现aiohttp警告,可在会话上下文块后显式关闭连接器(仅极端情况需要):
async with aiohttp.ClientSession() as session: # API调用逻辑 await session.connector.close()
内容的提问来源于stack exchange,提问作者average.everyman
相关产品推荐
相关产品推荐

