[python] Ukončení zaneprázdněného threadu
Bystrousak na seznam.cz
Bystrousak na seznam.cz
Pátek Duben 25 16:13:36 CEST 2008
Moc tomu nerozumím, takže se omlouvám, jestli budu plácat nesmysly;
Není to bezpečnostní chyba? Pokud si něco vezme paměť a OS jí po sestřelení neuvolní, zdá se mi to jako potenciální riziko, které by mohlo být zneužito nějakým škodlivým virem..
> ------------ Původní zpráva ------------
> Od: superman <feed na centrum.cz>
> Předmět: Re: [python] Ukončení zaneprázdněného threadu
> Datum: 24.4.2008 21:43:38
> ----------------------------------------
> Odstřelení threadu se obecně lidi brání, protože to je dost drastická
> věc, která mimo jiné může uvést i Váš program do neschopnosti dál
> pokračovat. Uvědomte si, že každý thread má svůj zásobník, a při
> násilném odstřelení threadu operační systém většinou zásobník neuklízí,
> ale nechá ho jakožto blok paměti v adresovém prostoru procesu být a
> nikdy ho neuvolní. Je to proto, že na zásobníku mohou být proměnné a
> data, které používají jiné thready, a pokud thread odstřelíte násilně,
> operační systém se domnívá, že je to nouzová akce, a že ostatní thready
> netuší o tom nic. A proto jim nechá zásobník s daty k dispozici, pokud
> by je náhodou jiné thready používaly.
>
> Zatímco při slušném způsoby ukončení, kdy se thread sám ukončí, operační
> systém po něm uklidí vše i zásobník.
>
> V praktickém programu pak zejména ve 32 bitovém systému máte omezený
> adresový prostor obvykle kolem 2 GB, a po určitém poměrně malém počtu
> takto násilně odstřelených threadu (kolem tisícovky) zaplníte celý
> adresový prostor procesu neuklizenými zásobníky, které nemáte jak
> uvolnit a můžete se dostat do stavu, kdy prostě program nebude schopen
> pokračovat v běhu, neboť nebude mít kam namapovat paměť.
>
> Proto se thready opravdy násilně neodstřelují, ale pouze se threadu
> nastaví příznak "hele threade, ukonči se prosím". A běžící thread
> příznak dostatečně často čte, řekněme třeba stokrát za sekundu, a
> jakmile zjistí, že by se měl ukončit, tak prostě se sám ukončí, čím se
> předejde výžše uvedenému zlu.
>
> Miloslav Ponkrác
>
>
> Jakub Lužný napsal(a):
> > Zdarec :-)
> >
> > Vytvořím vedlejší thread pomocí modulu threading a dám mu za úkol čekat.
> > Spustím ho, a v hlavním threadu dám pořád dokola něco vypisovat. Když potom
> > ale dám KeyboardInterrupt, tak se hlavní thread ukončí, ale vedlejší zůstane
> > viset na tom čekání. Je nějakej způsob, jak thread ukončit i s tím čekáním?
> >
> > #!/usr/bin/env python
> > import threading
> >
> > def thread1():
> > while(1):
> > čekej_do_nekonečna()
> >
> > t1 = threading.Thread(target = thread1)
> > t1.start()
> >
> > while(1):
> > print "blbnu :)"
> > _______________________________________________
> > 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