[Python-de] Multithreating unter Windows

Diez B. Roggisch deets at web.de
Don Sep 29 16:08:52 CEST 2005



> eine Frage zum Threating unter Windows :

Threating oder auch Multithreating ist eine sehr unschöne und potentiell 
gefährliche Angelegenheit - insbesondere wenn man es am falschen Ort 
macht: wer zB in einer Hell's Angels Kneipe multithreatet muss sich auf 
ein sehr blaues Auge gefasst machen...

Multithreading hingegen - das kann auch gefährlich werden, aber meistens 
nur in Form von Abstürzen.

> Wie kann man Thread-Zombies manuell killen ohne den Rechner neu zu booten.
> 
> Mein Problem:
> Ich habe mit Python 2.4 einige Threads unter Windows erzeugt ( insgesamt 
> 27 ), die noch zu existieren scheinen, wenn ich das Skript erneut 
> starte. Ich erhalte folgende Meldung :
> 
> Traceback (most recent call last):
> 
>  File "C:\python\ips_mon\experiment4\winevt_multiserve
> 
> r.py", line 99, in ?
> 
>    thread.start()
> 
>  File "C:\Python24\lib\threading.py", line 410, in start
> 
>    assert not self.__started, "thread already started"
> 
> AssertionError: thread already started
> 
> None
> 
> Mit dem Taskmanager kann man ja keine Threads sehen, aber ich kann 
> zumindest sicher sagen, das ich alle Prozesse, von denen aus ich die 
> Threads gestartet hatte, zwischendurch gekillt hatte. Leider ohne Erfolg.
> 
> Weiss jemand einen Rat ?

Grundsätzlich gilt, das unter windows (auch Linux) threads zu einem 
Prozess gehören - und beendet werden, wenn der Prozess beendet wird. 
Deshalb kann das was du da beschreibst nicht wirklich das Problem sein. 
Selbst _wenn_ threads übrig blieben (was IMHO völlig unmöglich ist) - 
das beeinträchtigt keines falls die Möglichkeiten eines anderen 
Prozesses (und das wäre ein neu gestartets Programm) threads zu starten.

Ich denke mal das ist eher ein Artefakt deines Programmes - startest du 
das womöglich aus einer IDE? Ausserdem kann man mit 
Thread.setDaemon(True) verhindern, das ein laufender Thread weiterläuft 
wenn der main-Thread sich beendet. Das ist aber im Grunde nur eine dünne 
Logikschicht die den Prozess an der Beendigung hindert solange noch 
laufende Threads da sind - steht also _nicht_ im Widerspruch zu oben 
gesagtem.

Also alles in allem:

  - setDaemon(Treu) aufrufen
  - Prozess extern starten, nicht aus einer IDE

Dann sollte das problem verschweinden.

MfG Diez