gpt4 book ai didi

python - 如何使用 aiohttp 处理 DNS 超时?

转载 作者:太空宇宙 更新时间:2023-11-03 15:04:14 24 4
gpt4 key购买 nike

aiohttp readme说:

If you want to use timeouts for aiohttp client please use standard asyncio approach: 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)

最佳答案

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

欢迎提出请求!

关于python - 如何使用 aiohttp 处理 DNS 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com