Python: mehrere while schleifen gleichzeitig ausführen?
Hallo und guten Abend Ich möchte in Python 2.7 mehrere Schleifen die zur gleichen Zeit laufen und sich gegenseitig beeinflussen können. Ich versuchte es mit mehreren einzelnen Scripts die in ein Dokument schrieben/lesen um sich gegenseitig zu beeinflussen. Ich wurde schon darauf hingewiesen es mit z.B: Threads zu versuchen, funktioniert bei mir nicht so wie ich will. Hat mir jemand vielleicht ein Beispiel Code oder kann mir sagen was ich falsch mache?
import time
from threading import Thread
x = 1
def testthread1(i):
while True:
x = time.time()
x = x + 1
print x, "\n"
def testthread2(j) :
while True:
y = x
z = x
print "thread 2\n"
i = 1
j = 1
while i == 1:
xyz = Thread(target=testthread2(j))
xyz.start(j)
print "1"
xyz = Thread(target=testthread1(i))
xyz.start(i)
print "2"
i = 2
als Ausgabe erhalte ich unendlich mal "Thread 2" das heisst das Programm startet testthread2 aber bleibt dann in der while Schleife stecken.... wie behebe ich das?
3 Antworten
Probiers evtl. mal so:
import time
from threading import Thread
class ThreadTest(Thread):
#nicht an eine Instanz gebundene Variablen
x = 0
y = 0
t = time.time()
locked = False #damit die Threads sich nicht gegenseitig interferieren
def __init__(self, i):
self.i = i #eine Instanzvariable (Zähler/Id)
Thread.__init__(self)
def run(self):
#damit wird das ganze auf ca. eine Minute Laufzeit begrenzt
while time.time() - ThreadTest.t < 60:
#blockieren, solange die Interferenzsperre aktiv ist
while ThreadTest.locked: time.sleep(0.01)
#die Interferenzsperre aktivieren
ThreadTest.locked = True
#wenn i ungerade ist
if self.i & 1 == 1:
#erhöhe die nicht instanzgebundene Variable y um die bisherige Laufzeit
ThreadTest.y += time.time() - ThreadTest.t
else:
#ansonsten erhöhe x
ThreadTest.x += time.time() - ThreadTest.t
#Ausgabe: Id x y
print self.i, ThreadTest.x, ThreadTest.y
#Interferenzsperre lösen
ThreadTest.locked = False
#ein wenig warten um die Lesbarkeit der Ausgaben zu verbessern
time.sleep(0.2)
#läuft für die Zahlen von 0 bis inklusive 4 je einmal durch
for i in range(0,5):
#erstelle eine Instanz von ThreadTest, setze die Id und starte den Thread
ThreadTest(i).start()
#jetzt nur noch warten...
Danke für diesen Queue-Code doch ich habe gerade herausgefunden dass es globale variabeln gibt... Ich denke mit diesen geht es besser für mich.
import time
from threading import Thread
x = 1
def testthread1(i):
while True:
x = time.time()
x = x + 1
print x, "\n"
def testthread2(j) :
while True:
y = x
z = x
print "thread 2\n"
time.sleep(1)
i = 1
j = 1
xyz = Thread(target=testthread2(j))
print "0"
print "1"
xyz = Thread(target=testthread1(i))
print "2"
i = 2
des ghet auch nicht ._.
Naja, was Du da versuchst nennt sich MPI, wenn ich mich nicht sehr täusche. Nicht trivial...
Da gibt's ein Projekt, das das in Python implementieren will: http://mpi4py.scipy.org/docs/usrman/index.html
Vielleicht hilft Dir das weiter.