Problem z limitem czasu urlib2 w Pythonie 2.6
Wygląda na to, że nie mogę dostaćurllib2
limit czasu do uwzględnienia. Przeczytałem - przypuszczam - wszystkie posty związane z tym tematem i wydaje się, że nie robię nic złego. Mam rację? Wielkie dzięki za pomoc.
Scenariusz:
Przed kontynuowaniem skryptu muszę sprawdzić połączenie internetowe. Następnie napisałem funkcję (Net_Access), która jest podana poniżej.
Kiedy wykonam ten kod z podłączonym interfejsem LAN lub Wifi i sprawdzając istniejącą nazwę hosta: wszystko jest w porządku, ponieważ nie ma błędu ani problemu, a więc nie ma limitu czasu.Jeśli odłączę złącze LAN lub sprawdzę nieistniejącą nazwę hosta, wartość limitu czasu wydaje się być ignorowana. Co jest nie tak z moim kodem?Niektóre informacje:
Ubuntu 10.04.4 LTS (działa na VirtualBox v4.2.6 VM, Host OS to MAC OS X Lion)cat /proc/sys/kernel/osrelease: 2.6.32-42-generic
Python 2.6.5Mój kod:
#!/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) Praca z podłączonym złączem LAN
$ $ time ./Net_Access
[--- Net_Access() --- Internet Access OK
real 0m0.223s
user 0m0.060s
sys 0m0.032s
2) Limit czasu nie działa, ze złączem LAN odłączonym
$ time ./Net_Access
[--- Net_Access() --- No network access
real 1m20.235s
user 0m0.048s
sys 0m0.060s
Dodano do oryginalnego posta: wyniki testu (przy użyciu IP zamiast FQDN)
Jak sugeruje @unutbu (patrz komentarze), zastąpienie nazwy FQDN w myhost adresem IP rozwiązuje problem: limit czasu jest brany pod uwagę.
Złącze LAN podłączone ...
$ time ./Net_Access [--- Net_Access () --- Dostęp do Internetu OK
real 0m0.289s
user 0m0.036s
sys 0m0.040s
Złącze LAN odłączone ...
$ time ./Net_Access [--- Net_Access () --- Brak dostępu do sieci
real 0m3.082s
user 0m0.052s
sys 0m0.024s
To jest miłe, ale oznacza, że limit czasu może być używany tylko z IP, a nie z FQDN. Dziwne...
Czy ktoś znalazł sposób na wykorzystanie limitu czasu urllib2 bez wchodzenia w rozdzielczość pre-DNS i przekazywania IP do funkcji, czy też najpierw używasz gniazda do testowania połączenia, a następnie uruchamiasz urllib2, gdy jesteś pewien, że możesz dotrzeć do celu?
Wielkie dzięki.