gpt4 book ai didi

python - 最大化并行请求数 (aiohttp)

转载 作者:行者123 更新时间:2023-12-02 06:05:16 26 4
gpt4 key购买 nike

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 进行测试),我发现添加更多要同时运行的网址最多只能帮助约 100 个网址,并且然后总时间开始与 url 数量成比例增长(或者换句话说,每个 url 的时间不会减少)。这表明尝试立即处理这些内容时会失败。此外,随着“一批”中的网址增多,我偶尔会收到连接超时错误。

enter image description here

  • 为什么会发生这种情况?到底是什么限制了这里的速度
  • 如何检查在给定计算机上可以发送的最大并行请求数是多少? (我的意思是一个确切的数字 - 不是上面通过“反复试验”得出的近似值)
  • 如何才能增加一次处理的请求数量?

我在 Windows 上运行这个。

编辑以回应评论:

这是相同的数据,但限制设置为。最后只有轻微的改善,并且一次发送 400 个 url 时出现许多连接超时错误。我最终对实际数据使用了 limit = 200

enter image description here

最佳答案

默认情况下,aiohttp 将同时连接数限制为 100。它通过将默认 limit 设置为 TCPConnector object 来实现。由 ClientSession 使用。您可以通过创建自定义连接器并将其传递给 session 来绕过它:

connector = aiohttp.TCPConnector(limit=None)
async with aiohttp.ClientSession(connector=connector) as session:
# ...

但请注意,您可能不想将此数字设置得太高:您的网络容量、CPU、RAM 和目标服务器都有自己的限制,尝试建立大量连接可能会导致失败增加。

最佳数量可能只能通过混凝土机器上的实验才能找到。

<小时/>

不相关:

您不必创建没有 reason 的任务。大多数 asyncio api 接受常规协程。例如,您的最后几行代码可以这样更改:

loop = asyncio.get_event_loop()
loop.run_until_complete(run(url_list))

如果您使用的是 Python 3.7,甚至只是 asyncio.run(run(url_list)) ( doc )

关于python - 最大化并行请求数 (aiohttp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com