如何使用aiohttp处理DNS超时?

时间:2016-01-09 23:46:22

标签: python python-3.x dns python-asyncio aiohttp

aiohttp readme说:

  

如果您想为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)

1 个答案:

答案 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中。

欢迎提出请求!