【发布时间】:2020-01-23 08:57:51
【问题描述】:
我正在使用aiohttp 执行一些并行的 HTTP 发布请求。
为了不超过阈值,我必须全局设置超时(在 ClientSession 上)。
问题是我想接受我在阈值之前完成的(部分会话)响应,例如,如果会话包含 10 个请求并且在超时之前我已经完成了其中的 5 个,我想取这5个的结果。但我还没有弄清楚如何做到这一点。
我使用的代码是这样的:
import aiohttp
import asyncio
import requests
async def fetch(session):
async with session.get("https://amazon.com") as response:
return response.status
async def main(n, timeout):
async with aiohttp.ClientSession(timeout=timeout) as session:
return await asyncio.gather(*(fetch(session) for _ in range(n)))
timeout = aiohttp.ClientTimeout(total=0.4)
res = asyncio.run(main(10, timeout))
print(res)
使用timeout = 0.4 会引发asyncio.TimeoutError,我不知道如何获得部分执行的响应。
例如,如果我将超时设置为 5 秒,则所有请求都已完成,我会获得一个包含十个 200 的列表。
谢谢
【问题讨论】:
标签: python async-await python-asyncio aiohttp