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_exgethostbyaddr 可能返回不同的 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支持有限的一组标志 getnameinfogetaddrinfo ;忽略未知标志。系统特定的标志,如 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 版本发生变更: 现在 herrorgaierror 使用标准库解析程序更一致地引发,并且具有更一致的errno值。

本地主机和广播名称的处理现在更加一致。

在 22.10.1 版本发生变更: 现在有一个 __del__ 方法,如果对象在未正确关闭的情况下被销毁,则发出警告。

close()[源代码]#

释放此对象持有的资源。

定义资源的子类应该重写。

在 22.10.1 版本加入.