我很难找到很多关于 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 但没有成功,但这可能是因为我缺乏理解。
谢谢您的指导。
您可以使用
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!')