Seite 1 von 1
Meine Threads arbeiten nicht simultan
Verfasst: Freitag 30. Januar 2009, 11:58
von PythonFan_FFM
Hallo,
ich versuche mich gerade ein bisschen an Threads heranzuarbeiten.
Dabei habe ich ein sehr einfaches Beispiel geschrieben.
Es geht mir darum, dass zwei Threads gleichzeitig bis 10 Zählen sollen.
Ich habe folgendes geschrieben:
Code: Alles auswählen
import threading
class MyThread (threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def start(self):
for i in range(10):
print self.name
thread1 = MyThread("Thread_1")
thread2 = MyThread("Thread_2")
thread1.start()
thread2.start()
Ich würde jetzt erwarten, dass irgendwie mal Thread_1 und mal Thread_2 an die Reihe kommt und seinen Namen ausgibt.
Dies ist nicht der Fall; beide arbeiten nach einander.
Kann mir jemand sagen was ich falsch mache?
Oder habe ich da was grundsätzliches nicht verstanden?
Gruß,
PythonFan
Verfasst: Freitag 30. Januar 2009, 12:09
von helduel
Moin,
mach auch der start-Methode eine run-Methode (das wird in einem Thread ausgeführt) und füg einfach ein time.sleep in deine Schleife mit ein. Dann geht's und durch das time.sleep wird's deutlicher sichtbar.
Gruß,
Manuel
Verfasst: Freitag 30. Januar 2009, 12:12
von Pekh
Letzteres: Du kannst die Reihenfolge, in der die Threads aufgerufen werden nicht beeinflussen. Darum kümmern sich Betriebssystem und CPU. Folglich kann es durchaus passieren, daß die beiden Threads nacheinander drankommen.
Zweitens ist das Runterzählen einer so kleinen Schleife offenbar innerhalb einer Zeitscheibe zu erledigen: Um den gewünschten Effekt zu erzielen, müßtest du nach jeder Ausgabe dem Betriebssystem mitteilen, daß dein Thread jetzt die Kontrolle an einen anderen Thread abgeben möchte. Das Kommando kenne ich jetzt gerade nicht, aber suche mal nach 'yield' oder ähnlichem.
Verfasst: Freitag 30. Januar 2009, 12:28
von PythonFan_FFM
Danke für eure Antworten. Aber irgendwas stimmt da immer noch nicht.
Ich habe das Skript jetzt ein bisschen modifiziert, und es sieht nun so aus:
Code: Alles auswählen
import threading
import time
g=0
class MyThread (threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
for i in range(10):
time.sleep(1)
print i,self.name
thread1 = MyThread("Thread_1")
thread2 = MyThread("Thread_2")
thread1.run()
thread2.run()
Jetzt müsste doch in der Pause von 1 Sekunde die jeder Thread schläft, eigentlich der andere weiterarbeiten, oder?
Ich habe auch schon 5 Sekunden Pausen gemacht, und jedes mal
arbeitet erst Thread 1 alles ab, dann Thread 2.
Wenn ich jetzt jedem Thread sage, dass er danach die Kontrolle an einen anderen Thread abgeben soll, dann brauch ich doch auch keine Threads oder? - Dann kann ich auch gleich alles als eine normale Funktion implementieren.
Kann mir vielleicht jemand sagen, was ich immer noch falsch mache/verstehe?
Danke!
Gruß,
PythonFan
Verfasst: Freitag 30. Januar 2009, 12:46
von helduel
Threads werden mit der start-Methode gestartet.
Code: Alles auswählen
import threading
import time
g=0
class MyThread (threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
for i in range(10):
time.sleep(1)
print i,self.name
thread1 = MyThread("Thread_1")
thread2 = MyThread("Thread_2")
thread1.start()
thread2.start()
So sollte es gehen.
Verfasst: Freitag 30. Januar 2009, 13:07
von PythonFan_FFM
Danke für die Antwort.
Wenn ich den Code so wie du ihn mir geschrieben hast ausführe, dann stürzt mein Python einfach ab.
Kein aufhängen oder so, es kommt einfach ein "pythonw.exe hat ein Problem festgestellt und muss beendet werden." und das wars.
Ich nutze Python 2.5.1. Windows MCE.
Weiß jemand warum das jetzt auf einmal absürzt??
Verfasst: Freitag 30. Januar 2009, 14:25
von HWK
Bei mir läuft's und die Threads werden parallel abgearbeitet. Python 2.4 auf Windows XP.
MfG
HWK
Verfasst: Freitag 30. Januar 2009, 15:14
von sma
PythonFan_FFM hat geschrieben:Ich nutze Python 2.5.1. Windows MCE.
Weiß jemand warum das jetzt auf einmal absürzt??
Muss an deiner Installation liegen. Prinzipiell läuft es und bestimmt auch unter Windows. Du könntest es ja mal mit dem aktuelleren CPython 2.6 versuchen, denn vielleicht ist deine Installation kaputt.
Übrigens wirst du in CPython bei diesem Beispiel auch auf einem Rechner mit mehreren Prozessor(kernen) keine echte Parallelität bekommen. Bei CPython kann immer nur ein Python-Thread gleichzeitig laufen. Diese Beschränkung nennt sich GIL (Global Interpreter Lock).
Stefan
Verfasst: Freitag 30. Januar 2009, 15:23
von rayo
Für echte parallele Prozesse gibts ab Python 2.6 das Modul multiprocessing, damit geht paralleles Arbeiten ziemlich einfach.
Gruss
Verfasst: Samstag 31. Januar 2009, 22:50
von birkenfeld
sma hat geschrieben:
Übrigens wirst du in CPython bei diesem Beispiel auch auf einem Rechner mit mehreren Prozessor(kernen) keine echte Parallelität bekommen. Bei CPython kann immer nur ein Python-Thread gleichzeitig laufen. Diese Beschränkung nennt sich GIL (Global Interpreter Lock).
Das ist so irreführend. Es können durchaus mehrere Python-Threads gleichzeitig laufen. Es kann nur jeweils einer Python-(Byte-)Code ausführen. Während low-level-calls auf C-Ebene (wie zum Beispiel das sleep()) ausgeführt werden, kann ein anderer Thread laufen.