gevent.resolver.ares
--基于C-ARES的主机名解析程序#
基于C-ARES的主机名解析器。
- class Resolver(hub=None, use_environ=True, **kwargs)[源代码]#
基类:
AbstractResolver
使用 c-ares 类库。
这个实现使用C-ARES库来处理名称解析。C-ares在套接字级别是本地异步的,因此可以很好地集成到gevent的事件循环中。
与…相比
gevent.resolver_thread.Resolver
(委托给本机系统解析器)实现要复杂得多。此外,有报告称,它没有正确地执行某些系统配置(例如,返回IPv4和IPv6结果的顺序可能与线程解析程序不匹配)。但是,由于它不使用线程,因此对于进行多次查找的应用程序,它的伸缩性可能更好。与系统解析器有一些已知的区别。
gethostbyname_ex
和gethostbyaddr
可能返回不同的aliaslist
元组成员。(有时是相同的,有时是不同的顺序,有时是完全不同的别名。)gethostbyname_ex
可以退回ipaddrlist
以不同的顺序。getaddrinfo
不返SOCK_RAW
结果。getaddrinfo
可能以不同的顺序返回结果。处理
.local
(MDN)名称可能不同,即使它们列在主机文件中。战神不会解决
broadcasthost
,即使在2020-04-30之前已在主机文件中列出。这一实施可能会提高
gaierror(4)
系统实施将提高herror(1)
反之亦然,错误号不同。然而,在2020-04-30之后,这一比例应该会大大降低。结果
localhost
可能不同。特别是,一些系统解析器将从getaddrinfo
与c-ares相比,如sock-dgram结果,c-ares可能会报告多家主机上的IP地址更多。系统实现可能返回一些完全限定的名称,而这个实现只返回主机名。似乎只有在中找到条目时才会出现这种情况
/etc/hosts
.c-ares支持有限的一组标志
getnameinfo
和getaddrinfo
;忽略未知标志。系统特定的标志,如AI_V4MAPPED_CFG
不支持。getaddrinfo
即使没有AI_CANONNAME
正在设置。getaddrinfo
似乎不支持IPv6符号作用域ID。
小心
这个模块被认为是对pypy非常实验性的,由于它在cython中的实现,它可能会慢一些。这也可能导致译员崩溃。
在 1.5.0 版本发生变更: 这个版本的gevent通常嵌入c-ares1.15.0或更新版本。在那个版本的c-ares中,域以
.onion
are never resolved 甚至发送到DNS服务器。在 20.5.0 版本发生变更:
getaddrinfo
现在使用c-ares 1.16或更新版本中的本机c-ares函数实现。在 20.5.0 版本发生变更: 现在
herror
和gaierror
使用标准库解析程序更一致地引发,并且具有更一致的errno值。本地主机和广播名称的处理现在更加一致。
在 22.10.1 版本发生变更: 现在有一个
__del__
方法,如果对象在未正确关闭的情况下被销毁,则发出警告。