Python httpx如何实现异步流式数据处理?现有同步示例如何改造?
改造思路正误判断
你的整体思路方向是成立的,但存在两处核心错误:
- 没有使用httpx异步客户端:异步场景下不能直接调用顶层的
httpx.stream方法,必须通过httpx.AsyncClient实例发起异步流式请求 - 异步生成器遍历方式错误:异步场景下
r.iter_bytes()返回的是异步生成器,不能用普通for加await的方式遍历,需要使用async for语法遍历
正确异步流式处理实现
首先要确保你安装的httpx支持异步功能,如果没装对应依赖可以执行pip install httpx[async]安装。
完整示例代码如下:
import asyncio import httpx # 示例回调函数:保存文件块 async def save_chunk_callback(chunk: bytes, file_handler): file_handler.write(chunk) async def async_stream_download(url: str, save_path: str): # 初始化异步客户端 async with httpx.AsyncClient() as client: # 发起异步流式GET请求 async with client.stream("GET", url) as response: # 打开待写入文件,大文件场景可替换为aiofiles的异步IO实现 with open(save_path, "wb") as f: # 异步遍历字节块,chunk_size可自定义块大小,默认1024字节 async for chunk in response.iter_bytes(chunk_size=1024*1024): # 调用异步回调处理块 await save_chunk_callback(chunk, f) if __name__ == "__main__": download_url = "https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-mini-memstick.img" save_file_path = "FreeBSD-12.0-RELEASE-amd64-mini-memstick.img" asyncio.run(async_stream_download(download_url, save_file_path))
补充说明
如果需要完全异步化避免IO阻塞,可以引入aiofiles库做异步文件写入,替换示例中的同步open逻辑即可。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

