Python 2.6 urlib2 timeout issue
Parece que no puedo conseguir elurllib2
tiempo de espera para tener en cuenta. Leí, supongo, todas las publicaciones relacionadas con este tema y parece que no estoy haciendo nada malo. ¿Estoy en lo correcto? Muchas gracias por su amable ayuda.
Guión:
Necesito verificar la conectividad a Internet antes de continuar con el resto de un script. Luego escribí una función (Net_Access), que se proporciona a continuación.
Cuando ejecuto este código con mi interfaz LAN o Wifi conectada, y al verificar un nombre de host existente: todo está bien ya que no hay ningún error o problema, por lo tanto no hay tiempo de espera.Si desconecto mi conector LAN o si comparo con un nombre de host inexistente, el valor de tiempo de espera parece ser ignorado. ¿Qué hay de malo con mi código por favor?Alguna información:
Ubuntu 10.04.4 LTS (ejecutándose en una VM VirtualBox v4.2.6, el SO Host es MAC OS X Lion)cat /proc/sys/kernel/osrelease: 2.6.32-42-generic
Python 2.6.5Mi 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) Trabajando, con el conector LAN enchufado
$ $ time ./Net_Access
[--- Net_Access() --- Internet Access OK
real 0m0.223s
user 0m0.060s
sys 0m0.032s
2) El tiempo de espera no funciona, con el conector de LAN desconectado
$ time ./Net_Access
[--- Net_Access() --- No network access
real 1m20.235s
user 0m0.048s
sys 0m0.060s
Añadido a la publicación original: resultados de la prueba (usando IP en lugar de FQDN)
Según lo sugerido por @unutbu (ver comentarios), reemplazar el FQDN en myhost con una dirección IP soluciona el problema: el tiempo de espera se toma en efecto.
Conector LAN enchufado ...
$ time ./Net_Access [--- Net_Access () --- Internet Access OK
real 0m0.289s
user 0m0.036s
sys 0m0.040s
Conector LAN desenchufado ...
$ time ./Net_Access [--- Net_Access () --- No hay acceso a la red
real 0m3.082s
user 0m0.052s
sys 0m0.024s
Esto es bueno, pero significa que el tiempo de espera solo se puede usar con IP y no con FQDN. Extraño...
¿Alguien encontró una manera de usar el tiempo de espera de urllib2 sin pasar a la resolución pre-DNS y pasar el IP a la función, o está usando el socket para probar la conexión y luego dispara urllib2 cuando está seguro de que puede alcanzar el objetivo?
Muchas gracias.