如果您想为aiohttp客户端使用超时,请使用标准的asyncio方法: 来自asyncio.wait_for(client.get(url),10)
的收益率
但是这不能处理DNS超时,我想这是由操作系统处理的。此外,with aiohttp.Timeout
不处理OS DNS查找。
在asyncio repo进行了讨论而没有最终结论,Saghul已经aiodns进行了讨论,但我不确定如何将其混合到aiohttp以及是否允许asyncio.wait_for
功能。
Testcase(我的linux盒子需要20秒):
async def fetch(url):
url = 'http://alicebluejewelers.com/'
with aiohttp.Timeout(0.001):
resp = await aiohttp.get(url)
答案 0 :(得分:4)
Timeout
按预期工作,但不幸的是你的例子挂起了python shutdown程序:它等待终止执行DNS查找的后台线程。
作为一种解决方案,我建议使用aiodns
进行手动IP解析:
import asyncio
import aiohttp
import aiodns
async def fetch():
dns = 'alicebluejewelers.com'
# dns = 'google.com'
with aiohttp.Timeout(1):
ips = await resolver.query(dns, 'A')
print(ips)
url = 'http://{}/'.format(ips[0].host)
async with aiohttp.get(url) as resp:
print(resp.status)
loop = asyncio.get_event_loop()
resolver = aiodns.DNSResolver(loop=loop)
loop.run_until_complete(fetch())
也许解决方案值得作为可选功能包含在TCPConnector中。
欢迎提出请求!