Python异步任务并发数控制首选asyncio.Semaphore,通过async with语义自动管理许可,避免资源耗尽;批量任务需包装限流协程,动态调整宜用aiolimiter等成熟库。
Python
异步任务
的并发数控制,核心在于限制同时运行的协程数量,避免资源耗尽或触发限流。最常用、最推荐的方式是使用
asyncio.Semaphore
,它轻量、语义清晰、与 async/await 天然契合。
用 Semaphore 控制最大并发数
Semaphore 是 asyncio 提供的同步原语,类似“许可证池”:每次进入异步上下文前 acquire 一个许可,完成后 release 归还。超出设定数量的任务会自动等待。
初始化时传入最大并发数,例如
表示最多 5 个任务并发
在协程中用
包裹实际耗时逻辑(如 HTTP 请求、数据库操作)
无需手动调用 acquire/release,async with 自动处理异常安全的释放
批量提交任务时统一限流
当有大量待执行的协程(如 100 个 fetch_url 调用),不要直接
—— 这会全部并发。应包装成受控任务:
定义一个带 semaphore 的包装协程:
将原始协程逐个传入包装器,生成新任务列表
再用
执行这批受控任务
动态调整并发数(进阶场景)
某些服务需根据响应延迟或错误率动态升降并发度(如自适应限流)。此时可封装一个可变 Semaphore:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
继承
或封装其内部计数器(注意 asyncio.Semaphore._value 是私有属性,不建议直接改)
更稳妥做法:用
保护一个共享整数变量 + 配合
实现带优先级/弹性容量的任务调度器
生产环境推荐用成熟库如
,它提供 rate-limiting 语义(QPS 控制)和动态调整接口
别踩坑:常见误用与替代方案对比
有人尝试用
手动维护固定 size 的任务池,逻辑复杂且易出错;也有人混淆
的 max_workers(那是线程数,非协程并发数)。
Semaphore 是协程级并发控制的黄金标准,简单可靠
避免在同步代码里混用 threading.Semaphore,它会阻塞 event loop
若需精确到每秒请求数(如 10 QPS),用
更合适
sem = asyncio.Semaphore(5)async with sem:asyncio.gather(*tasks)async def limited_task(sem, coro): async with sem: return await coroasyncio.gatherasyncio.Semaphoreasyncio.Lockasyncio.Queueaiolimiterasyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)concurrent.futures.ThreadPoolExecutoraiolimiter.AsyncLimiter(10, 1)