[python] Problém s blokujícím urlopen

azurIt azurit na pobox.sk
Pondělí Březen 15 10:21:55 CET 2010


Vlakno nevies ukoncit 'natvrdo', musi sa ukoncit samo (a kedze je zblokovane, tak to bohuzial neurobi).


>-----Pôvodná správa-----
>Od: Juda Kaleta [mailto:admin74 na volny.cz]
>Komu: Konference PyCZ <python na py.cz>
>Predmet: Re: [python] Problém s blokujícím urlopen
>
>
>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
>>
>>
>_______________________________________________
>Python mailing list
>Python na py.cz
>http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python