很明显,它将使用扭曲名称 api 而不是任何阻塞方式来解析主机名。但是在源代码中挖掘,我一直无法找到名称解析发生的地方。有人可以向我指出发生主机解析的相关源代码(例如,在尝试执行 a 时connectTCP
)。我真的需要确保connectTCP
不会使用阻止 DNS 解析。
问问题
585 次
2 回答
3
这似乎很明显,不是吗?
很遗憾:
- 名称解析并不总是以明显的方式配置。你以为你只需要读书
/etc/resolv.conf
吗?即使在 Linux 和 DNS 的特定情况下,您也可能需要查看任意数量的文件以查找名称服务器。 - 名称解析比 DNS 复杂得多。您必须进行 mDNS 解析,可能会查找一些 LDAP 计算机记录,然后您必须遵守指示这些之间的顺序的本地配置,例如
/etc/nsswitch.conf
. - 名称解析不通过标准或有用的非阻塞 API 公开。即使是特定于 glibc 的也
getaddrinfo_a
通过 SIGIO 公开其非阻塞性,而不仅仅是您可以查看的文件描述符。这意味着,就像 POSIX AIO 一样,它可能只是你背后的内核线程。
由于这些原因,除其他外,Twisted 默认使用仅gethostbyname
在线程中调用的解析器。
但是,如果您知道对于您的应用程序来说,仅使用 DNS 主机名解析是合适的,并且您希望使用twisted.names
而不是您的平台解析器 - 换句话说,如果规模对您来说比使用深奥的名称解析更重要 -案例 - 支持。您可以将解析器安装到twisted.names.client
反应器上,为您的应用程序进行适当配置,并且所有未来的内置名称解析都将使用该解析器进行。
于 2013-05-23T17:49:31.637 回答
1
我不是很熟悉twisted
,我最近才开始使用它。看起来它并没有阻塞,但仅在支持线程的平台上。
在twisted.internet.base
in 中,ReactorBase
它看起来像是通过它的resolve
方法进行解析,该方法返回一个 deferred from self.resolver.getHostByName
。
self.resolver
是一个BlockingResolver
默认情况下会阻塞的实例,但看起来如果平台支持线程化,则解析器实例ThreadedResolver
在ReactorBase._initThreads
方法中被替换为。
于 2013-05-23T14:51:26.750 回答