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 自定义控制任务并发数量 控制任务的执行并发
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐