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