Frage zur Beendung eines Thread-Programms

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Frage zur Beendung eines Thread-Programms

Beitragvon samy-delux » Donnerstag 18. Oktober 2007, 13:58

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
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Beitragvon samy-delux » Donnerstag 18. Oktober 2007, 14:21

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...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 18. Oktober 2007, 14:34

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Beitragvon samy-delux » Donnerstag 18. Oktober 2007, 15:45

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
BlackJack

Beitragvon BlackJack » Donnerstag 18. Oktober 2007, 16:29

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()
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Beitragvon samy-delux » Donnerstag 18. Oktober 2007, 17:45

Sehr gut, Danke!
Wieder was dazugelernt.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Freitag 19. Oktober 2007, 08:03

ansonsten mach thread.setDeamon(True). :-)
TUFKAB – the user formerly known as blackbird

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder