aiohttp中不使用asyncio.Semaphore的话,默认请求量是多少
·
在 aiohttp 中,如果你不显式使用 asyncio.Semaphore 限制并发数,那么默认的并发控制是由 aiohttp.TCPConnector 控制的,而不是无限制的。
默认并发限制关键点:
1. 默认连接池大小
aiohttp.ClientSession内部默认使用TCPConnector(limit=100);- 也就是说,默认最多允许 100 个并发 TCP 连接(不是任务数);
- 这个限制是 全局连接数,包括所有域名(除非你使用
limit_per_host);
from aiohttp import ClientSession, TCPConnector
# 默认情况下,limit 是 100
connector = TCPConnector() # 等同于 TCPConnector(limit=100)
session = ClientSession(connector=connector)
2. 如果你没有使用 Semaphore
- 所有请求会被尽可能调度出去,但最终还是受 TCP 连接数限制;
- 也就是说,即使你创建了 1000 个任务,最多 100 个会同时连接;
- 剩下的会排队等待连接可用。
为什么还需要 Semaphore?
- 你需要进一步控制实际并发数(比如:每秒最多 10 个);
- 你需要避免过载对方服务器或触发限流;
- **你有资源瓶颈(如 CPU/内存/网速)**时,想主动控制压力。
示例:显式控制并发(可选)
import asyncio
import aiohttp
sem = asyncio.Semaphore(20) # 限制最多 20 个并发任务
async def fetch(url, session):
async with sem:
async with session.get(url) as resp:
return await resp.text()
总结:
| 控制方式 | 默认并发上限 | 作用域 |
|---|---|---|
不使用 Semaphore |
由 TCPConnector(limit=100) 控制 |
针对 TCP 连接(所有请求共享) |
使用 Semaphore |
自定义控制任务并发数量 | 控制任务的执行并发 |
更多推荐




所有评论(0)