Вот связанный вопрос, но я не мог понять, как применить ответ на mechanize/urllib2: как заставить библиотеку httplib python использовать только A-запросы
В принципе, учитывая этот простой код:
#!/usr/bin/python
import urllib2
print urllib2.urlopen('http://python.org/').read(100)
Это приводит к тому, что прокси-сервер говорит следующее:
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.