异步Python下载zip压缩包并提取归档文件的相关问题咨询
问题修复与异步zip操作方案
现有代码错误原因
- 你请求的是二进制zip资源,调用
resp.json()是完全错误的:该方法仅用于解析JSON格式的响应体,解析非JSON内容会直接返回None,这就是你遇到类型错误的核心原因 - 你把
resp.json()的返回值赋值给了response变量,后续调用的response.content是不存在的属性,正确的响应对象是client.get返回的resp本身 - 标准库
zipfile的解压操作是同步逻辑,直接在协程中执行会阻塞事件循环,影响其他异步任务的运行
修复后可运行代码
import aiohttp import zipfile import io import asyncio from concurrent.futures import ThreadPoolExecutor # 全局线程池,用于运行同步解压逻辑,避免阻塞事件循环 executor = ThreadPoolExecutor(max_workers=2) async def unzip(zip_file_url): async with aiohttp.ClientSession() as client: async with client.get(zip_file_url) as resp: # 直接读取完整的二进制响应内容 zip_bytes = await resp.read() # 同步解压逻辑封装,扔到线程池执行 def sync_extract(): with zipfile.ZipFile(io.BytesIO(zip_bytes)) as zf: zf.extractall("zip/") await asyncio.get_event_loop().run_in_executor(executor, sync_extract)
异步场景zip操作选型说明
- 下载环节:直接使用
aiohttp即可,不需要额外的特殊异步库 - 解压环节:目前没有原生的高性能异步zip处理库,标准库
zipfile的功能覆盖绝大多数场景,配合线程池运行解压逻辑即可完全适配异步架构,不会阻塞事件循环 - 如果你需要处理GB级超大zip包,不想占用过多内存,可以用
resp.content流式读取响应,边下载边喂给zipfile做流式解压
内容的提问来源于stack exchange,提问作者Артем Иодко
相关产品推荐
相关产品推荐

