1. Python 异步编程实战:四大经典场景深度解析
在当今高并发的互联网应用中,异步编程已经成为提升性能的必备技能。作为一名长期使用 Python 进行高并发开发的工程师,我经常遇到需要同时处理大量网络请求、实时数据流或长连接通信的场景。传统的同步编程方式在这些场景下往往力不从心,而异步编程则能轻松应对。
本文将分享我在实际项目中总结出的四个最具代表性的异步编程实战场景。这些案例都经过生产环境验证,每个方案都包含完整的实现细节和避坑指南。无论你是刚接触 asyncio 的新手,还是想进一步提升异步编程技能的中级开发者,这些实战经验都能为你提供直接可复用的解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 批量下载图片:并发控制与性能优化
2.1 需求分析与设计思路
在实际项目中,我们经常需要从网络批量下载大量资源,比如图片、文档或视频。同步下载方式效率低下,而简单的异步并发又容易导致服务器过载或被封禁。一个健壮的下载器需要具备以下特性:
- 并发控制:限制同时进行的下载任务数量
- 断点续传:记录下载进度,支持中途恢复
- 错误处理:自动重试失败的任务
- 性能统计:记录下载速度、成功率等指标
基于这些需求,我设计了一个使用 asyncio 和 aiohttp 的解决方案。核心是通过 Semaphore 控制并发量,结合 aiofiles 实现异步文件写入,确保在高并发下载时不会耗尽系统资源。
2.2 核心代码实现
python复制import asyncio
import aiohttp
import aiofiles
from pathlib import Path
import time
from dataclasses import dataclass
from typing import List
@dataclass
class DownloadResult:
"""下载结果数据结构"""
url: str
status: str # success/failed/error
size: int = 0
error: str = ""
async def download_image(session: aiohttp.ClientSession,
url: str,
save_path: Path) -> DownloadResult:
"""下载单张图片的实现"""
try:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=30)) as response:
if response.status == 200:
content = await response.read()
async with aiofiles.open(save_path, 'wb') as f:
await f.write(content)
return DownloadResult(url=url, status="success", size=len(content))
return DownloadResult(url=url, status="failed",
error=f"HTTP {response.status}")
except asyncio.TimeoutError:
return DownloadResult(url=url, status="error", error="Timeout")
except Exception as e:
return DownloadResult(url=url, status="error", error=str(e))
async def batch_download(urls: List[str],
save_dir: str,
max_concurrent: int = 10) -> dict:
"""批量下载主函数"""
save_path = Path(save_dir)
save_path.mkdir(parents=True, exist_ok=True)
semaphore = asyncio.Semaphore(max_concurrent)
