これは関連する質問ですが、mechanize / urllib2に答えを適用する方法を理解できませんでした:PythonhttplibライブラリにAリクエストのみを使用させる方法
基本的に、この単純なコードを考えると:
#!/usr/bin/python
import urllib2
print urllib2.urlopen('http://python.org/').read(100)
これにより、wiresharkは次のように言います。
0.000000 10.102.0.79 -> 8.8.8.8 DNS Standard query A python.org
0.000023 10.102.0.79 -> 8.8.8.8 DNS Standard query AAAA python.org
0.005369 8.8.8.8 -> 10.102.0.79 DNS Standard query response A 82.94.164.162
5.004494 10.102.0.79 -> 8.8.8.8 DNS Standard query A python.org
5.010540 8.8.8.8 -> 10.102.0.79 DNS Standard query response A 82.94.164.162
5.010599 10.102.0.79 -> 8.8.8.8 DNS Standard query AAAA python.org
5.015832 8.8.8.8 -> 10.102.0.79 DNS Standard query response AAAA 2001:888:2000:d::a2
これは5秒の遅延です。
システムのどこでもIPv6を有効にしていない(gentooでコンパイルされているUSE=-ipv6
)ので、PythonにIPv6ルックアップを試す理由はないと思います。
上記の質問は、AF_INET
素晴らしいサウンドのソケットタイプを明示的に設定することを提案しました。urllibを強制する方法や、自分で作成したソケットを使用するように機械化する方法がわかりません。
編集:他のアプリにも遅延があったため、AAAAクエリが問題であることがわかっています。また、ipv6を無効にして再コンパイルするとすぐに、問題は解決しました...引き続きAAAAリクエストを実行するPythonを除きます。