kleines Thread Beispiel

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.
Antworten
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

Hallo Python forum,

ich habe eine kleine allgemeine frage:
ich bin bei den Thread angelangt :-)
ich würde gerne 2 Thread parallel laufen lassen.
beide haben eine Endlosschleife.
siehe code:

Code: Alles auswählen

def thread1():
    while 1:
        #time.sleep(2)
        print "thread1"

def thread2():
    while 1:
        #time.sleep(2)
        print "thread2"



#Hauptprogramm
print "Start Hauptprogramm"
try:
    while True:
        thread.start_new_thread(thread1,())
        thread.start_new_thread(thread2,())
        #time.sleep(1)
except:
    "Es ist ein Fehler aufgetreten"

print "Ende Hauptprogramm"
wenn ich den Thread starte kommt sehr schnell folgende Fehlermeldung:

sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
thread1thread2thread2thread2thread1thread2thread2thread1thread2thread2thread1thread1thread1thread2thread1thread1thread1thread2thread1thread1thread1thread2thread1thread1thread1thread1thread2thread2thread1thread2


kann mir jemand sagen was ich falsch mache?
vielen Dank im voraus
BlackJack

@köttbullar: Du verwendest das falsche Modul. `thread` ist schon seit Ewigkeiten „deprecated“ und man sollte `threading` nehmen.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Zeile 16 bis 18: In einer Endlosschleife startest Du immer neue Threads, es sind aber nicht beliebig viele Threads möglich geschweige denn sinnvoll, bei ein paar Zehntausend ist Schluss und dann wird ein Fehler geworfen.

Zeile: 15, 20, 21: Du glaubst, dass Du hier eine Fehlerbehandlung hast, tatsächlich hättest Du aber eine bessere Fehlerbehandlung, wenn Du die Zeilen 15, 20 und 21 einfach weglassen würdest, dann würdest Du nämlich die Fehlermeldung:
thread.error: can't start new thread
sehen können.

Mit einer kleinen Änderung funktioniert es aber:

Code: Alles auswählen

import thread
import time

def thread1():
    while 1:
        #time.sleep(1)
        print "thread1"
 
def thread2():
    while 1:
        #time.sleep(1)
        print "thread2"
 
#Hauptprogramm
print "Start Hauptprogramm"
thread.start_new_thread(thread1,())
thread.start_new_thread(thread2,())

while True:
    time.sleep(10)
    
print "Ende Hauptprogramm"
Wobei "Ende Hauptprogramm" nie erreicht wird.

Hier findest Du weitere Thread-Beispiele: http://www.python-kurs.eu/threads.php
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@MagBen: das was in Deinem verlinkten "Kurs" geschrieben steht, ist zum größten Teil Quark. Sätze wie "Die Verwaltung von Threads ist für das Betriebssystem einfacher, weshalb Threads auch als Leichtgewichtprozesse bezeichnet werden." haben den Informationsgehalt von 500 Blatt frischem Kopierpapier; einfacher als was? Bei den meisten Betriebssystemen dürfte bei der Einführung von Threads einiges an Komplexität dazugekommen sein. Aussagen wie "Man kann einen Thread somit wie einen Funktionsaufruf sehen" sind nicht nur falsch sondern auch gefährlich, wenn man das denkt. Die Verwendung von Locks ist fehlerhaft und der Busy-Loop macht das nicht besser.

@köttbullar: vergiss dass es das thread-Modul gibt und nimm threading.
Damit könnte das so aussehen:

Code: Alles auswählen

from threading import Thread
import time

def run_thread(num):
    while True:
        print "thread", num
        time.sleep(0.1)

def main():
    threads = []
    for i in range(3):
        thread = Thread(target=run_thread, args=(i,)) 
        thread.daemon = True
        thread.start()
        threads.append(thread)
    time.sleep(30)

if __name__ == '__main__':
    main()
Antworten