[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