tl;dr:如何最大化可以并行发送的 http 请求数量?
我正在从多个网址获取数据aiohttp
图书馆。我正在测试它的性能,我发现在这个过程中的某个地方存在瓶颈,一次运行更多的网址并没有帮助。
我正在使用这段代码:
import asyncio
import aiohttp
async def fetch(url, session):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0'}
try:
async with session.get(
url, headers=headers,
ssl = False,
timeout = aiohttp.ClientTimeout(
total=None,
sock_connect = 10,
sock_read = 10
)
) as response:
content = await response.read()
return (url, 'OK', content)
except Exception as e:
print(e)
return (url, 'ERROR', str(e))
async def run(url_list):
tasks = []
async with aiohttp.ClientSession() as session:
for url in url_list:
task = asyncio.ensure_future(fetch(url, session))
tasks.append(task)
responses = asyncio.gather(*tasks)
await responses
return responses
loop = asyncio.get_event_loop()
asyncio.set_event_loop(loop)
task = asyncio.ensure_future(run(url_list))
loop.run_until_complete(task)
result = task.result().result()
运行这个url_list
不同长度(测试https://httpbin.org/delay/2)我发现,添加更多要同时运行的 url 最多只能帮助大约 100 个 url,然后总时间开始与 url 数量成比例增长(或者换句话说,每个 url 的时间不会减少)。这表明尝试立即处理这些内容时会失败。此外,随着“一批”中的网址增多,我偶尔会收到连接超时错误。
- 为什么会发生这种情况?究竟是什么限制了speed here?
- 我怎样才能检查什么是maximum我可以在给定计算机上发送的并行请求数? (我的意思是一个确切的数字 - 不是上面通过“反复试验”得出的近似值)
- 我能做什么increase一次处理的请求数量?
我在 Windows 上运行这个。
EDIT回复评论:
这是相同的数据,限制设置为None
。最后只有轻微的改善,并且一次发送 400 个 url 时出现许多连接超时错误。我最终使用了limit = 200
根据我的实际数据。