[python] Problém s blokujícím urlopen
Juda Kaleta
admin74 na volny.cz
Pondělí Březen 15 06:01:45 CET 2010
Nápad - co hodit to získávání dat do nějakého vlákna a pokud se nestihne
do tří sekund samo zakončit, prostě ho ukončit natvrdo?
Yetty
> Zdravím,
>
> snad mi poradí někdo tady.
>
> V jedné aplikaci stahuji soubor přes http pomocí urlopen z modulu
> urllib2. Konkrétně se jedná o textový soubor s údaji o počasí, ale
> problém se týká obecně jakéhokoliv uri.
>
> Funkce urlopen přijímá v parametru timeout časový limit pro navázání
> spojení, který ale zřejmě ignoruje když je nedostupná DNS.
> Následující kód by měl skončit po cca 3 sekundách při neúspěšném
> spojení, ale zasekne se a skončí asi až po minutě.
>
> import urllib2
> url = 'http://weather.noaa.gov/pub/data/observations/metar/stations/
> LKPR.TXT'
> try:
> data = urllib2.urlopen(url, timeout=3)
> except:
> print 'Failed to retrieve a data !'
>
> V případě navazování spojení na nameserver skript dokonce nereaguje
> ani na signál SIGALRM.
> Následující kód by měl vyvolat výjimku po 3 sekundách, ale také
> zůstane viset na 20x delší dobu:
>
> import urllib2, signal
>
> def sig_handler(num,frame):
> raise Exception('Failed to retrieve a data !')
>
> try:
> signal.signal(signal.SIGALRM, sig_handler)
> signal.alarm(3)
> data = urllib2.urlopen('http://weather.noaa.gov/pub/data/
> observations/metar/stations/LKPR.TXT')
> except Exception as excpt_dsc:
> print str(excpt_dsc)
>
> Zkoušel jsem i nastavit socket.setdefaulttimeout, ale taky bez efektu.
>
> Podmínkou je, že síťové rozhraní musí být nakonfigurované a aktivní,
> ale nesmí být dostupný žádný z nakonfigurovaných DNS serverů. Tohle se
> stává dost často u mobilních notebooků, než se nebo pokud vůbec podaří
> překonfigurovat síť na novém místě. Aplikace po tu dobu vůbec
> nereaguje.
>
> Python 2.6.4, Linux 2.6.33, glibc 2.11.1
>
> Předem díky za nakopnutí správným směrem.
>
> David
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>
Další informace o konferenci Python