gpt4 book ai didi

python-asyncio - aiohttp 错误率随着连接数的增加而增加

转载 作者:行者123 更新时间:2023-12-05 00:50:15 24 4
gpt4 key购买 nike

我正在尝试从数百万个不同的站点获取状态代码,我正在使用 asyncio 和 aiohttp,我使用不同数量的连接(但请求超时)运行以下代码,但得到了非常不同的结果,特别是更高数量的以下异常。

'concurrent.futures._base.TimeoutError'



编码
import pandas as pd
import asyncio
import aiohttp

out = []
CONNECTIONS = 1000
TIMEOUT = 10

async def fetch(url, session, loop):
try:
async with session.get(url,timeout=TIMEOUT) as response:
res = response.status
out.append(res)
return res
except Exception as e:
_exception = 'Error: '+str(type(e))
out.append(_exception)
return _exception

async def bound_fetch(sem, url, session, loop):
async with sem:
await fetch(url, session, loop)

async def run(urls, loop):
tasks = []
sem = asyncio.Semaphore(value=CONNECTIONS,loop=loop)
_connector = aiohttp.TCPConnector(limit=CONNECTIONS, loop=loop)
async with aiohttp.ClientSession(connector=_connector,loop=loop) as session:
for url in urls:
task = asyncio.ensure_future(bound_fetch(sem, url, session, loop))
tasks.append(task)
responses = await asyncio.gather(*tasks,return_exceptions=True)
return responses

## BEGIN ##

tlds = open('data/sample_1k.txt').read().splitlines()
urls = ['http://{}'.format(x) for x in tlds[1:]]

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run(urls,loop))
ans = loop.run_until_complete(future)

print(str(pd.Series(out).value_counts()))

结果

CONNECTIONS=1000



enter image description here

CONNECTIONS=100



enter image description here

这是一个错误吗?这些站点使用状态代码进行响应并按顺序运行或以较低的连接运行,没有超时错误,为什么会发生这种情况?当您更改连接数时,其他异常似乎稳定。 ClientOSErrors 来自实际超时或响应的站点,老实说真的不知道 concurrent.futures._base.TimeoutError 错误来自哪里。

最佳答案

想象一下,您同时在浏览器中打开了 1000 个网址。我敢打赌,您会注意到其中许多在 10 秒后没有加载。这不是错误,而是机器资源的限制。

您正在执行的并行请求越多 -> 每个请求的网络容量越少,每个请求的 CPU 时间越少,每个请求的 RAM 越少 -> 每个请求在超时之前没有准备好的可能性更高。

如果您看到 1000 个连接有很多超时,请减少连接(并可能增加超时)。基于 aiohttp documentation使用不同的 ClientSession实例也可能有帮助:

Unless you are connecting to a large, unknown number of different servers over the lifetime of your application, it is suggested you use a single session for the lifetime of your application

关于python-asyncio - aiohttp 错误率随着连接数的增加而增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45800857/

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