[python] Ukončení zaneprázdněného threadu

superman feed na centrum.cz
Čtvrtek Duben 24 21:36:01 CEST 2008


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
>
>
>   



Další informace o konferenci Python