Python 2.6: проблема с тайм-аутом urlib2
Кажется, я не могу получитьurllib2
время ожидания должно быть принято во внимание. Я прочитал - я полагаю - все посты, связанные с этой темой, и, кажется, я не делаю ничего плохого. Я прав? Большое спасибо за вашу помощь.
Сценарий:
Мне нужно проверить подключение к Интернету, прежде чем продолжить с оставшимся сценарием. Затем я написал функцию (Net_Access), которая представлена ниже.
Когда я выполняю этот код при подключенном интерфейсе локальной сети или Wi-Fi и проверяя существующее имя хоста: все в порядке, так как нет ошибок или проблем, поэтому нет тайм-аута.Если я отключаю разъем локальной сети или проверяю несуществующее имя хоста, значение тайм-аута, похоже, игнорируется. Что не так с моим кодом, пожалуйста?Некоторая информация:
Ubuntu 10.04.4 LTS (работает на виртуальной машине VirtualBox v4.2.6, хост-ОС - MAC OS X Lion)cat /proc/sys/kernel/osrelease: 2.6.32-42-generic
Python 2.6.5Мой код:
#!/usr/bin/env python
import socket
import urllib2
myhost = 'http://www.google.com'
timeout = 3
socket.setdefaulttimeout(timeout)
req = urllib2.Request(myhost)
try:
handle = urllib2.urlopen(req, timeout = timeout)
except urllib2.URLError as e:
socket.setdefaulttimeout(None)
print ('[--- Net_Access() --- No network access')
else:
print ('[--- Net_Access() --- Internet Access OK')
1) Работа с подключенным разъемом LAN
$ $ time ./Net_Access
[--- Net_Access() --- Internet Access OK
real 0m0.223s
user 0m0.060s
sys 0m0.032s
2) Тайм-аут не работает, сетевой разъем отключен
$ time ./Net_Access
[--- Net_Access() --- No network access
real 1m20.235s
user 0m0.048s
sys 0m0.060s
Добавлено в исходное сообщение: результаты теста (с использованием IP вместо FQDN)
В соответствии с предложением @unutbu (см. Комментарии) замена полного доменного имени в myhost IP-адресом устраняет проблему: время ожидания вступает в силу.
Разъем локальной сети подключен ...
$ time ./Net_Access [--- Net_Access () --- Доступ в Интернет в порядке
real 0m0.289s
user 0m0.036s
sys 0m0.040s
Разъем локальной сети отключен ...
$ time ./Net_Access [--- Net_Access () --- Нет доступа к сети
real 0m3.082s
user 0m0.052s
sys 0m0.024s
Это хорошо, но это означает, что тайм-аут может использоваться только с IP, а не FQDN. Weird ...
Кто-то нашел способ использовать тайм-аут urllib2 без разрешения до DNS и передать IP функции, или вы сначала используете сокет для проверки соединения, а затем запускаете urllib2, когда уверены, что можете достичь цели?
Большое спасибо.