这里有一个相关的问题,但我无法弄清楚如何应用答案机械化/ 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