Thread ein 2. Mal starten

moin
ich möchte einen Thread mehrfach starten (also starten-beenden-starten-...)
Doch beim 2. Start bekomme ich die Fehlermeldung "AssertionError: thread already started", obwohl ich beim Beenden des Threads extra mit join() warte.
Wenn ich mir den Quelltext zu threading.Thread ansehe, ist das auch kein Wunder: Die Funktion start testet auf die Variable self.__started und setzt sie im Anschluss selbst auf True. Die Variable wird aber zu keinem Zeitpunkt auf False gesetzt, der Thread kann also gar kein 2. Mal gestartet werden.
Die Funktion isAlive tested auf "self.__started and not self.__stopped". Das könnte die Funktion start natürlich auch tun, aber dann ist die Variable self.__started irgendwie sinnfrei. Alternativ könnte die Funktion __stop die Variable auf False setzen, aber dann meckert join. Letztendlich beist sich die Katze selbst in'n Schwanz.
Es kann ja aber auch nicht der Sinn sein, jedesmal eine neue Instanz der Klasse zu erzeugen, wenn der Thread gestartet werden soll, oder? Welche Intention steckt also hinter diesem Design? Aus der Doku geht nicht hervor, das ein Thread nicht neugestartet werden darf, wenn er beendet wurde.
Vielen Dank schonmal für eure Antworten cu boesi

Es kann ja aber auch nicht der Sinn sein, jedesmal eine neue Instanz der Klasse zu erzeugen, wenn der Thread gestartet werden soll, oder?
Doch, genau das ist der Sinn.
Welche Intention steckt also hinter diesem Design? Aus der Doku geht nicht hervor, das ein Thread nicht neugestartet werden darf, wenn er beendet wurde.
Ein Thread *kann* auf Betriebssystemebene nur einmal gestartet werden. Wenn er das nächste Mal gestartet wird, ist es ein anderer Thread. Jeder Thread hat eine Thread-Id, die einmalig ist und für jeden anderen Thread anders ist.
Die Python-Thread-Klasse folgt diesem Modell. Wenn man für ein Thread-Objekt .join() ausführt, dann meint man damit den eindeutigen, einmaligen Betriebssystem-Thread. Nachdem der Thread zuende ist, muss .join() sofort wiederkehren. Diese Semantik wäre verletzt, wenn das gleiche Python-Thread-Objekt nacheinander verschiedene Threads repräsentieren würde.
Ciao, Martin
participants (2)
-
"Martin v. Löwis"
-
Alexander 'boesi' Bösecke