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

Juda Kaleta admin74 na volny.cz
Pondělí Březen 15 13:40:37 CET 2010


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 <azurit na pobox.sk>

> 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
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20100315/b8ac75e4/attachment.html>


Další informace o konferenci Python