這裏有一個相關的問題,但我無法弄清楚如何應用答案機械化/ urllib2的:how to force python httplib library to use only A requests強制python mechanize/urllib2只使用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,問題就消失了......除了在python中仍然執行AAAA請求。
同樣在這裏,在不同的機器連接到differend提供商。我使用了libwww-perl,它是GET命令 - 它可以在所有機器上立即運行。 – 2011-01-21 21:07:37