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...
2010/3/15 azurIt <[email protected]> > Vlakno nevies ukoncit 'natvrdo', musi sa ukoncit samo (a kedze je > zblokovane, tak to bohuzial neurobi). > > > >-----Pôvodná správa----- > >Od: Juda Kaleta [mailto:[email protected]] > >Komu: Konference PyCZ <[email protected]> > >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 > >> [email protected] > >> http://www.py.cz/mailman/listinfo/python > >> > >> > >_______________________________________________ > >Python mailing list > >[email protected] > >http://www.py.cz/mailman/listinfo/python > _______________________________________________ > Python mailing list > [email protected] > http://www.py.cz/mailman/listinfo/python > >
_______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
