2

很明显,它将使用扭曲名称 api 而不是任何阻塞方式来解析主机名。但是在源代码中挖掘,我一直无法找到名称解析发生的地方。有人可以向我指出发生主机解析的相关源代码(例如,在尝试执行 a 时connectTCP)。我真的需要确保connectTCP不会使用阻止 DNS 解析。

4

2 回答 2

3

似乎很明显,不是吗?

很遗憾:

  1. 名称解析并不总是以明显的方式配置。你以为你只需要读书/etc/resolv.conf吗?即使在 Linux 和 DNS 的特定情况下,您也可能需要查看任意数量的文件以查找名称服务器。
  2. 名称解析比 DNS 复杂得多。您必须进行 mDNS 解析,可能会查找一些 LDAP 计算机记录,然后您必须遵守指示这些之间的顺序的本地配置,例如/etc/nsswitch.conf.
  3. 名称解析不通过标准或有用的非阻塞 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.basein 中,ReactorBase它看起来像是通过它的resolve方法进行解析,该方法返回一个 deferred from self.resolver.getHostByName

self.resolver是一个BlockingResolver默认情况下会阻塞的实例,但看起来如果平台支持线程化,则解析器实例ThreadedResolverReactorBase._initThreads方法中被替换为。

于 2013-05-23T14:51:26.750 回答