Od niedawna staram się poznać Pythona i napotkałem mały problem.
Dotyczy on wątków. Mimo użycia setDaemon(True), wątki zdają sie czekać
na siebie, tzn watek nr 1 czeka aż skończy pracować watek 2 i dopiero
wtedy zabiera sie do dzieła. Chce żeby oba wątki pracowały
jednosczesnie, co robię źle? Bardzo proszę o pomoc.
import time
from threading import Thread
class Printer:
def __init__(self):
self.Watek().run()
for x in range(1,11):
print "%s. Watek 1" % x
time.sleep(1)
class Watek(Thread):
def __init__(self):
Thread.__init__(self)
self.setDaemon(True)
def run(self):
for x in range (1,11):
print "%s. Watak 2" % x
time.sleep(1)
if __name__ == "__main__":
Printer()
Pozdrawiam
Zajrzyj tutaj ( http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
).
class MyThread(threading.Thread):
def run(self):
...
class Printer(object):
def __init__(self):
self.my_thread = MyThread()
self.my_thread.start()
for i in xrange(11):
print 'Bla bla bla %d' % (i,)
self.my_thread.join() # czekamy aż wątek się zakończy
Pamiętaj, że rodzic _ZAWSZE_ musi czekać aż wątek się zakończy. Jeśli
parent umrze przed dzieciakiem, będziesz miał zombie w systemie lub deadlock.
Pozdrawiam
Beorn
--
Daniel 'Beorn' Mróz <be...@alpha.pl> http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*]
[ r++ y+ ]
> Pamiętaj, że rodzic _ZAWSZE_ musi czekać aż wątek się zakończy. Jeśli
> parent umrze przed dzieciakiem, będziesz miał zombie w systemie
Po pierwsze zombie to tylko wpis w tabeli procesów. Nic więcej. Czyli
jedyny zasób jaki zużywa, to numer PID. Służy *wyłącznie* do tego,
żeby rodzic mógł wykonać wait().
Po drugie jeśli procesowi umrze rodzic, to jest przygarnianay przez
dziadka, jeśli tego nie ma, to przez Init (proces z PID 1). Init
odpali od razu wait() dla takiego zombiaka i zombie natychmiast
zniknie.
> lub deadlock.
??? Przecież w momencie śmierci wątku zasoby są automagicznie
zwalniane.
> Po drugie jeśli procesowi umrze rodzic, to jest przygarnianay przez
> dziadka, jeśli tego nie ma, to przez Init (proces z PID 1). Init
> odpali od razu wait() dla takiego zombiaka i zombie natychmiast
> zniknie.
Tak, zniknie pod warunkiem ze wątek się zakończy sam z siebie. Moze on
czekac na wiadomosc ( sposobó komunikacji dowolny) od rodzica, a gdy
rodzica nie ma to ...
... to znaczy, że program jest niepoprawny. Tyle i tylko tyle. Nie ma
to nic do tego w jakiej kolejności należy ubijać wątki.