扭曲的epollreactor是否使用非阻塞dns查找?

时间:2013-05-23 14:04:03

标签: python dns twisted

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

2 个答案:

答案 0 :(得分:3)

似乎显而易见,不是吗?

不幸的是:

  1. 并不总是以明显的方式配置名称解析。你认为你只需阅读/etc/resolv.conf?即使在Linux和DNS的特定情况下,您也可能需要查找任意数量的文件来查找名称服务器。
  2. 名称解析比DNS复杂得多。您必须执行mDNS解析,可能会查找某些LDAP计算机记录,然后您必须遵守本地配置,这些配置规定了/etc/nsswitch.conf之间的顺序。
  3. 不通过标准或有用的非阻塞API公开名称解析。即使是特定于glibc的getaddrinfo_a也会通过SIGIO暴露其非阻塞性,而不仅仅是您可以观看的文件描述符。这意味着,like POSIX AIO,它可能只是你背后的核心线程。
  4. 由于这些原因,Twisted默认使用只在线程中调用gethostbyname的解析器。

    但是,如果您知道适用于您的应用,则仅使用DNS进行主机名解析是合适的,并且您希望使用twisted.names而不是平台解析程序 - 在其他如果规模对你而言比对深奥的名称解析用例更重要 - 这是支持的。您可以从install resolver twisted.names.client appropriately configured for your application到反应堆{{3}},所有未来的内置名称解析都将使用该解析器进行。

答案 1 :(得分:1)

我不是很熟悉twisted,我最近才开始使用它。它看起来似乎没有阻止,但仅限于支持线程的平台。

twisted.internet.base中的ReactorBase看起来它通过它的resolve方法解析它会从self.resolver.getHostByName返回延迟。

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