ホスト名を解決するためにブロックする方法ではなく、ねじれた名前の API を使用することは明らかです。しかし、ソース コードを調べてみると、名前解決が行われている場所を見つけることができませんでした。誰かがホスト解決が発生する関連するソースコードを教えてくれませんか(connectTCP
たとえば、を実行しようとしたとき)。connectTCP
ブロッキング DNS 解決を使用しないことを確認する必要があります。
2 に答える
明らかですね。
不運にも:
- 名前解決は、常に明確な方法で構成されているわけではありません。あなたはただ読む必要があると思います
/etc/resolv.conf
か?Linux と DNS の特定のケースでも、ネーム サーバーを探すために任意の数のファイルを調べなければならない場合があります。 - 名前解決は、単なる DNS よりもはるかに複雑です。mDNS 解決を行う必要があり、場合によってはいくつかの LDAP コンピューター レコードを検索してから、
/etc/nsswitch.conf
. - 名前解決は、標準または有用なノンブロッキング API を介して公開されません。glibc 固有のものでさえ、
getaddrinfo_a
監視できるファイル記述子だけでなく、SIGIO を介してその非ブロック性を公開します。つまり、POSIX AIOのように、とにかく背後にあるカーネル スレッドにすぎないということです。
gethostbyname
これらの理由から、Twisted はデフォルトでスレッドを呼び出すだけのリゾルバーを使用します。
ただし、アプリケーションで DNS のみのホスト名解決が適切であることがわかっていて、プラットフォーム リゾルバーではなく使用したいtwisted.names
場合、つまり、難解な名前解決の使用よりもスケールが重要な場合は、ケース - サポートされています。リアクターにリゾルバーをインストールし、アプリケーション用に適切に構成すると、将来の組み込みの名前解決はすべてそのリゾルバーで行われます。twisted.names.client
私は にあまり詳しくありませんtwisted
。最近使い始めたばかりです。ただし、ブロックされないように見えますが、スレッドをサポートするプラットフォームでのみです。
intwisted.internet.base
では、 deferred from を返すメソッドをReactorBase
介して解決しているように見えます。resolve
self.resolver.getHostByName
self.resolver
はBlockingResolver
デフォルトでブロックするインスタンスですが、プラットフォームがスレッド化をサポートしている場合、リゾルバー インスタンスはメソッドで置き換えられるようThreadedResolver
ですReactorBase._initThreads
。