Jasné, ale ono ho ani není potřeba ukončovat. Stačí si po třech sekundách zjistit jestli byly do ve vlákně přijaty nějaká data a pokud ne, vypsat chybovou hlášku a vlákno může klidně běžet dál, dokud se neukončí. Případně pokud po neúspěchu aplikace končí, mělo by stačit nastavit ho jako démona, aby se aplikace ukončila...<br>
<br><div class="gmail_quote">2010/3/15 azurIt <span dir="ltr"><<a href="mailto:azurit@pobox.sk">azurit@pobox.sk</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Vlakno nevies ukoncit 'natvrdo', musi sa ukoncit samo (a kedze je zblokovane, tak to bohuzial neurobi).<br>
<br>
<br>
>-----Pôvodná správa-----<br>
>Od: Juda Kaleta [mailto:<a href="mailto:admin74@volny.cz">admin74@volny.cz</a>]<br>
>Komu: Konference PyCZ <<a href="mailto:python@py.cz">python@py.cz</a>><br>
>Predmet: Re: [python] Problém s blokujícím urlopen<br>
<div><div></div><div class="h5">><br>
><br>
>Nápad - co hodit to získávání dat do nějakého vlákna a pokud se nestihne<br>
>do tří sekund samo zakončit, prostě ho ukončit natvrdo?<br>
><br>
>Yetty<br>
><br>
><br>
><br>
>> Zdravím,<br>
>><br>
>> snad mi poradí někdo tady.<br>
>><br>
>> V jedné aplikaci stahuji soubor přes http pomocí urlopen z modulu<br>
>> urllib2. Konkrétně se jedná o textový soubor s údaji o počasí, ale<br>
>> problém se týká obecně jakéhokoliv uri.<br>
>><br>
>> Funkce urlopen přijímá v parametru timeout časový limit pro navázání<br>
>> spojení, který ale zřejmě ignoruje když je nedostupná DNS.<br>
>> Následující kód by měl skončit po cca 3 sekundách při neúspěšném<br>
>> spojení, ale zasekne se a skončí asi až po minutě.<br>
>><br>
>> import urllib2<br>
>> url = '<a href="http://weather.noaa.gov/pub/data/observations/metar/stations/" target="_blank">http://weather.noaa.gov/pub/data/observations/metar/stations/</a><br>
>> LKPR.TXT'<br>
>> try:<br>
>> data = urllib2.urlopen(url, timeout=3)<br>
>> except:<br>
>> print 'Failed to retrieve a data !'<br>
>><br>
>> V případě navazování spojení na nameserver skript dokonce nereaguje<br>
>> ani na signál SIGALRM.<br>
>> Následující kód by měl vyvolat výjimku po 3 sekundách, ale také<br>
>> zůstane viset na 20x delší dobu:<br>
>><br>
>> import urllib2, signal<br>
>><br>
>> def sig_handler(num,frame):<br>
>> raise Exception('Failed to retrieve a data !')<br>
>><br>
>> try:<br>
>> signal.signal(signal.SIGALRM, sig_handler)<br>
>> signal.alarm(3)<br>
>> data = urllib2.urlopen('<a href="http://weather.noaa.gov/pub/data/" target="_blank">http://weather.noaa.gov/pub/data/</a><br>
>> observations/metar/stations/LKPR.TXT')<br>
>> except Exception as excpt_dsc:<br>
>> print str(excpt_dsc)<br>
>><br>
>> Zkoušel jsem i nastavit socket.setdefaulttimeout, ale taky bez efektu.<br>
>><br>
>> Podmínkou je, že síťové rozhraní musí být nakonfigurované a aktivní,<br>
>> ale nesmí být dostupný žádný z nakonfigurovaných DNS serverů. Tohle se<br>
>> stává dost často u mobilních notebooků, než se nebo pokud vůbec podaří<br>
>> překonfigurovat síť na novém místě. Aplikace po tu dobu vůbec<br>
>> nereaguje.<br>
>><br>
>> Python 2.6.4, Linux 2.6.33, glibc 2.11.1<br>
>><br>
>> Předem díky za nakopnutí správným směrem.<br>
>><br>
>> David<br>
>> _______________________________________________<br>
>> Python mailing list<br>
>> <a href="mailto:Python@py.cz">Python@py.cz</a><br>
>> <a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
>><br>
>><br>
>_______________________________________________<br>
>Python mailing list<br>
><a href="mailto:Python@py.cz">Python@py.cz</a><br>
><a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@py.cz">Python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
</div></div></blockquote></div><br>