处理大量请求的aiohttp session.get()超时问题

问题描述 投票:0回答:1

我很难找到很多关于 aiohttp 的文档,特别是最近的一些文档。我不断地一遍又一遍地浏览相同的几页,主要是 github 问题和文档,但找不到问题的关键。

问题是,在执行大量请求时,待处理的请求在发送之前就会超时。

这是由于请求 (session.get()) 的默认超时为 5 分钟,该超时从等待完成的时间开始计算,而不是实际的请求(如果我理解得很好的话)。 因此,我被阻止,因为留下固定超时将取消(超时)该时间之后的所有待处理请求,或者将超时设置为将使程序在无响应的站点上无限期地等待this issues中提出了同样的问题,但我没有得到解决方法。

这是我失败的代码:

async def request(session, url):
    try:
        resp = await session.get(url)
    except:
        "FAIL"
    else:
        "SUCCESS"

async def session():
    urls = loadUrls()
    coros = []
    async with aiohttp.ClientSession() as session:
        for url in urls:
            coros.append(request(session, url))
        await asyncio.gather(*coros, return_exceptions=True)

def main():
    loop = asyncio.new_event_loop()
    loop.run_until_complete((session()))
    loop.close()

我尝试过设置 TCPConnector limit=None,但没有成功。

我看到有人谈论使用 asyncio.wait 而不是 asyncio.gather,但如上面所示的问题 3203,没有成功。

我尝试为每个请求设置一个 ClientSession 但没有成功,但这可能是因为我缺乏理解。

谢谢您的指导。

python python-3.x python-asyncio aiohttp
1个回答
4
投票

您可以使用

ClientSession
 自定义 
ClientTimeout
上的超时,如下所示:

my_timeout = aiohttp.ClientTimeout(
    total=None, # total timeout (time consists connection establishment for a new connection or waiting for a free connection from a pool if pool connection limits are exceeded) default value is 5 minutes, set to `None` or `0` for unlimited timeout
    sock_connect=10, # Maximal number of seconds for connecting to a peer for a new connection, not given from a pool. See also connect.
    sock_read=10 # Maximal number of seconds for reading a portion of data from a peer
)

client_args = dict(
    trust_env=True,
    timeout=my_timeout
)

# Pass args
async with aiohttp.ClientSession(**client_args) as session:
    ...
    # do stuff here
    for url in urls:
        coros.append(request(session, url))
    
    # Try awaiting, if a timeout, do something else
    try:
        await asyncio.gather(*coros, return_exceptions=True)
    except asyncio.exceptions.TimeoutError:
        print('Timeout!')

© www.soinside.com 2019 - 2024. All rights reserved.