2017-02-06 3 views
1

Die Geschichte mit zwei Threads und einer globalen Variablen beginnen, die .. :) viel Zeit ändernPython globale Variable in einem Thread

Thema Nummer eins (der Einfachheit halber werden wir rufen t1) erzeugt eine Zufallszahl und speichern es in einer globalen Variable GLB.

Thread Nummer zwei (aka t2) überprüfen Sie den Wert der globalen Variablen und wenn es einen Wert erreicht beginnt seinen Wert bis zu einem bestimmten Zeitraum zu drucken.

ABER wenn t1 den Wert dieser globalen Variable ändert, ändern Sie auch den Wert innerhalb der Schleife und ich will das nicht!

Ich versuche Pseudo-Code zu schreiben:

import random 
import time 
import threading 


GLB = [0,0] 

#this is a thread 
def t1(): 
    while True: 
     GLB[0] = random.randint(0, 100) 
     GLB[1] = 1 
     print GLB 
     time.sleep(5) 


#this is a thread 
def t2(): 
    while True: 
     if GLB[0]<=30: 
      static = GLB 
      for i in range(50): 
       print i," ",static 
       time.sleep(1) 




a = threading.Thread(target=t1) 
a.start() 


b = threading.Thread(target=t2) 
b.start() 

while True: 
    time.sleep(1) 

Die Frage ist: Warum variable statische Änderung für die innerhalb der Schleife? Es sollte konstant bleiben, es entkommt aus der Schleife! Konnte ich eine Sperre für die Variable erstellen? Oder gibt es eine andere Möglichkeit, das Problem zu lösen?

Vielen Dank.

+0

'Static' sollte sich in dieser Schleife nicht ändern. Wie wäre es mit einem kleinen Arbeitsbeispiel, das wir testen könnten? – tdelaney

+0

Ein Problem ist, dass sich "GLB" ändern kann, bevor Sie die Möglichkeit haben, "statisch" zuzuweisen. Sehen Sie das? – tdelaney

+0

@AlejandroSazo 'static' ist eine neue Referenz auf das Objekt, so dass es nicht kopiert werden muss. Da es ein unveränderliches "int" ist, bekommt man sowieso keine Kopie. – tdelaney

Antwort

0

GLB ist ein veränderbares Objekt. Um einem Thread einen konsistenten Wert anzuzeigen, während ein anderer Thread ihn ändert, können Sie das Objekt entweder vorübergehend mit einer Sperre schützen (der Modifikator wartet) oder das Objekt kopieren. In Ihrem Beispiel scheint eine Kopie die beste Option zu sein. In Python ist eine Slice-Kopie atomar und benötigt daher kein anderes Locking.

import random 
import time 
import threading 

GLB = [0,0] 

#this is a thread 
def t1(): 
    while True: 
     GLB[0] = random.randint(0, 100) 
     GLB[1] = 1 
     print GLB 
     time.sleep(5) 

#this is a thread 
def t2(): 
    while True: 
     static = GLB[:] 
     if static[0]<=30: 
      for i in range(50): 
       print i," ",static 
       time.sleep(1) 

a = threading.Thread(target=t1) 
a.start() 

b = threading.Thread(target=t2) 
b.start() 

while True: 
    time.sleep(1) 
+0

Ich füge zwei time.sleep() hinzu, um expliziter zu sein. Die variable statische Änderung innerhalb der for-Schleife, während ich Aspekt, der für die ganze Zeit "konstant" ist, ist innerhalb der Schleife !! – egariM

+0

Ich schrieb einen Arbeitstest und 'static' ändert sich nicht. Schreib einen Test, poste ihn und beweise mich falsch! – tdelaney

+0

Thw zwei Funktionen sind innerhalb eines Threads und t1() ändert ständig den Wert der globalen Variablen auch wenn ich innerhalb der for-Schleife von t2() bin. Ist ok wenn ich einen externen Link in den Code einfüge? Pastebin verwenden? – egariM