Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Thread

11 views
Skip to first unread message

Marcin Łabuz

unread,
Sep 19, 2009, 8:55:42 AM9/19/09
to
Witam,

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

ryniek90

unread,
Sep 19, 2009, 9:27:02 AM9/19/09
to

Daniel Mróz

unread,
Sep 19, 2009, 3:23:15 PM9/19/09
to
On 19.09.2009, Marcin Łabuz <lab...@gmail.com> wrote:
> 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()
Straszny bałagan masz w tym kodzie. Klasa w klasie, złe wywołanie wątku,
brak kontroli, dziwne pętle, które niewiadomo co robią, old-style classes,
mieszanie typów w interpolacji łańcuchów, ...


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

Bart Ogryczak

unread,
Sep 21, 2009, 10:00:55 AM9/21/09
to
On Sep 19, 9:23 pm, Daniel Mróz <be...@alpha.pl> wrote:

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


bartekplus

unread,
Sep 21, 2009, 2:37:31 PM9/21/09
to
On Sep 21, 4:00 pm, Bart Ogryczak <b.ogryc...@gmail.com> wrote:
> On Sep 19, 9:23 pm, Daniel Mróz <be...@alpha.pl> wrote:

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

Bart Ogryczak

unread,
Sep 22, 2009, 11:35:11 AM9/22/09
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.

0 new messages