DNSPython异步解析超时但同步解析正常,如何排查解决?
问题排查与解决方法
核心原因
dnspython 2.1.0版本在Windows 10平台存在异步UDP解析和默认ProactorEventLoop事件循环的兼容缺陷,同步解析走系统原生套接字逻辑不受该缺陷影响,因此会出现同步正常、异步超时的现象。
排查步骤
- 首先测试强制TCP解析是否正常,执行代码:
asyncio.run(resolver.resolve('www.google.com', tcp=True)),如果可以正常返回结果,即可确认是UDP兼容问题 - 检查Python默认事件循环类型,执行代码打印当前循环:
print(type(asyncio.get_event_loop_policy())),如果输出为<class 'asyncio.windows_events.WindowsProactorEventLoopPolicy'>,则匹配兼容问题场景
可用解决方案
- 方案1:升级dnspython到2.3.0及以上版本,该版本已修复Windows平台异步解析的兼容问题,升级命令:
pip install --upgrade dnspython - 方案2:如果无法升级依赖版本,手动切换Windows事件循环为Selector模式,在导入dns相关模块前执行以下代码:
import asyncio asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
- 方案3:无需修改版本或事件循环,调用异步resolve时强制走TCP协议,代码示例:
import asyncio from dns.asyncresolver import Resolver resolver = Resolver() resolver.nameservers = ['8.8.8.8'] asyncio.run(resolver.resolve('www.google.com', tcp=True))
内容的提问来源于stack exchange,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

