You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:52:16