Seite 1 von 1

Frage zur Beendung eines Thread-Programms

Verfasst: Donnerstag 18. Oktober 2007, 13:58
von samy-delux
Hey Leute,

Ich habe ein Programm was 5 Threads startet, welche ihre Daten aus einer Queue lesen.
Das klappt soweit, aber das Problem ist, dass das Programm sich nicht beendet. Ist ja auch klar, denn es fragt immer weiter ob noch Daten in der Queue sind!
Mein Code Teil sieht so aus:

Code: Alles auswählen

    def run (self):
        while True:
            data = userPool.get()
            
            if data != None:
                self.ProcessUser(data)
            else:
                exit(1)
Leider wird das "exit(1)" nie aufgerufen.
Hier würde außerdem natürlich der Fehler passieren, dass sich das Programm beendet, sobald die Queue leer ist. Aber es wird nicht überprüft ob alle Threads wirklich fertig sind. Es kann also sein, dass noch 4 Threads arbeiten wenn das Programm beendet wird.

Wie beende ich die Threads nun richtig?

so long,
Samy

Verfasst: Donnerstag 18. Oktober 2007, 14:21
von samy-delux
Ok, ein bisschen weiter bin ich schon.
Ich weiß nun, das meine "if date != None" Abfrage sinnlos ist, da der Thread "userPool.get()" so lange angehalten wird, bis etwas aus der Queue kommt.

Hier seht ihr wie ich die Queue fülle und die Threads starte:

Code: Alles auswählen

for row in result:
        userPool.put( row )

    for x in xrange ( 5 ):
       UserThread().start()
Ich weiß nur leider immer noch nicht, wie ich nun das Programm beenden kann, wenn die Queue leer ist und alle Threads fertig sind...

Verfasst: Donnerstag 18. Oktober 2007, 14:34
von gerold
samy-delux hat geschrieben:Ich weiß nur leider immer noch nicht, wie ich nun das Programm beenden kann, wenn die Queue leer ist und alle Threads fertig sind...
Hallo Samy!

Im Thread mit ``queue.get_nowait()`` arbeiten und den Fehler ``Queue.Empty`` abfangen. Wenn Fehler auftritt --> Thread beenden lassen.

Beim Erstellen der Threads musst du dir die Referenzen zu den Threads behalten, damit du diese für ``.join()`` zur Verfügung hast.

Code: Alles auswählen

threads = []
for i in range(5):
    threads.append(<neuer Thread>)
    threads[-1].start()

# Hier wird gewartet bis alle Threads fertig sind
for thread in threads:
    thread.join()

# ENDE
mfg
Gerold
:-)

Verfasst: Donnerstag 18. Oktober 2007, 15:45
von samy-delux
Ok, danke!
Es reichte sogar schon einfach nur alle Threads sich selbst beenden zu lassen.

Hier aber noch eine kleine Frage:
Ich habe eine Klasse:

Code: Alles auswählen

class MyClass:
	def __init__(self):
		self.var = "test"
Wenn ich nun folgendes mache, dann klappt dies:

Code: Alles auswählen

test = MyClass()
print test.var
Wenn ich nun die Klasse in der datei "MyClass.py" abspeicher und sie per "import MyClass" einbinde, dann klappt das ganze nicht mehr.
Wie geht das richtig?

so long,
Samy

Verfasst: Donnerstag 18. Oktober 2007, 16:29
von BlackJack
Du importierst das *Modul* `MyClass` und darin steckt die *Klasse* `MyClass`. Also entweder:

Code: Alles auswählen

import MyClass
test = MyClass.MyClass()

# oder

from MyClass import MyClass
test = MyClass()

Verfasst: Donnerstag 18. Oktober 2007, 17:45
von samy-delux
Sehr gut, Danke!
Wieder was dazugelernt.

Verfasst: Freitag 19. Oktober 2007, 08:03
von mitsuhiko
ansonsten mach thread.setDeamon(True). :-)