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-genericPython 2.6.5

Mó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.

questionAnswers(2)

yourAnswerToTheQuestion