3

aiohttp自述文件说:

如果您想为 aiohttp 客户端使用超时,请使用标准 asyncio 方法:yield from asyncio.wait_for(client.get(url), 10)

但这并不能处理 DNS 超时,我猜这些超时是由操作系统处理的。with aiohttp.Timeout也不处理操作系统 DNS 查找。

asyncio repo上进行了讨论,但没有最终结论,Saghul 已经制作了aiodns,但我不确定如何将它混入 aiohttp 以及这是否允许asyncio.wait_for功能。

测试用例(在我的 linux 机器上需要 20 秒):

async def fetch(url):
    url = 'http://alicebluejewelers.com/'
    with aiohttp.Timeout(0.001):
        resp = await aiohttp.get(url)
4

1 回答 1

4

Timeout按预期工作,但不幸的是,您的示例挂在 python 关闭过程中:它等待执行 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 中。

欢迎请求请求!

于 2016-01-10T03:12:05.147 回答