Python 2.6 urlib2 timeout issue

Parece que não consigo pegar ourllib2 timeout a ser levado em conta. Eu li - suponho - todas as postagens relacionadas a este tópico e parece que não estou fazendo nada errado. Estou correcto? Muito obrigado pela sua gentil ajuda.

Cenário:

Preciso verificar a conectividade com a Internet antes de continuar com o restante de um script. Eu então escrevi uma função (Net_Access), que é fornecida abaixo.

Quando eu executo este código com a minha interface LAN ou Wifi conectada, e verificando um nome de host existente: tudo está bem, pois não há erro ou problema, portanto, não há tempo limite.Se eu desconectar meu conector de LAN ou verificar um nome de host inexistente, o valor de tempo limite parece ser ignorado. O que há de errado com o meu código, por favor?

Algumas informações:

Ubuntu 10.04.4 LTS (executando em uma VM VirtualBox v4.2.6, o sistema operacional host é o MAC OS X Lion)cat /proc/sys/kernel/osrelease: 2.6.32-42-genericPython 2.6.5

Meu código:

#!/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) Trabalhando, com o conector de LAN conectado

$ $ time ./Net_Access 
[--- Net_Access() --- Internet Access OK

real    0m0.223s
user    0m0.060s
sys 0m0.032s

2) Tempo limite não funcionando, com o conector de LAN desconectado

$ time ./Net_Access 
[--- Net_Access() --- No network access

real    1m20.235s
user    0m0.048s
sys 0m0.060s

Adicionado à postagem original: resultados de teste (usando IP em vez de FQDN)

Como sugerido por @unutbu (ver comentários), a substituição do FQDN em myhost por um endereço IP corrige o problema: o tempo limite é efetivado.

Conector LAN ligado ...
$ time ./Net_Access [--- Net_Access () --- Acesso à Internet OK

real    0m0.289s
user    0m0.036s
sys 0m0.040s

Conector de LAN desconectado ...
$ time ./Net_Access [--- Net_Access () --- Sem acesso à rede

real    0m3.082s
user    0m0.052s
sys 0m0.024s

Isso é bom, mas significa que o tempo limite só pode ser usado com IP e não com o FQDN. Esquisito...

Alguém encontrou uma maneira de usar o timeout urllib2 sem entrar na resolução pré-DNS e passar o IP para a função, ou você está usando primeiro o socket para testar a conexão e depois disparar o urllib2 quando tiver certeza de que pode alcançar o alvo?

Muito Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion