python threading mit globalen Variablen
stieß ich auf ein problem beim schreiben von python-threading-code, dass ich schrieb, einige Arbeiter threading-Klassen, Sie alle importieren eine Globale Datei-wie sharevar.py brauche ich eine variable wie regdevid zu halten
die Verfolgung der register Geräte-id, dann, wenn ein thread ändern, es Wert ist, dann können andere threads
Holen Sie es frisch, aber das Ergebnis ist, dass: wenn ein thread ändern, es ist Wert, die anderen bekommen immer noch den Standard-Wert, den ich definiert sharevar.py Datei, warum?
etwas falsch mit mir?
# thread a
from UserShare import RegDevID
import threading
class AddPosClass(threading.Thread):
global commands
# We need a pubic sock, list to store the request
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
data = self.queue.get()
#print data
RegDevID = data
#print data
send_queue.put(data)
self.queue.task_done()
# thread b
import threading
from ShareVar import send_queue, RegDevID
"""
AddPos -- add pos info on the tail of the reply
"""
class GetPosClass(threading.Thread):
global commands
# We need a pubic sock, list to store the request
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
data = self.queue.get()
#print data
data = RegDevID
#print data
send_queue.put(data)
self.queue.task_done()
# ShareVar.py
RegDevID = '100'
Das ist es, wenn ein thread verändert die RegDevID, thread b noch erhalten, es ist default-Wert.
Dank advanced.
from ShareVar import RegDevID
class Test():
def __init__(self):
pass
def SetVar(self):
RegDevID = 999
def GetVar(self):
print RegDevID
if __name__ == '__main__':
test = Test();
test.SetVar()
test.GetVar()
Den ShareVar.py:
RegDevID = 100
Das Ergebnis:
100
warum?
- Wahrscheinlich gibt es nichts falsch mit Ihnen, aber vielleicht sollten Sie zeigen Sie Ihren code.
- Bitte formatieren Sie den code korrekt...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie sicher, dass Sie veröffentlicht Ihre tatsächliche code? Sie importiert RegDevID aus zwei verschiedenen Modulen:
vs
So oder so, dein problam hat nichts zu tun mit dem Durchzug. Denk 'an aus somemodule import somevar' wie eine Funktionsanweisung. Das entspricht rund einem Zauber um ein Modul zu laden, wenn es nicht bereits geladen ist, gefolgt von:
Beim importieren RegDevID aus dem anderen Modul erstellen Sie einen frischen Namen in dem aktuellen Modul. Wenn Sie mutieren, das Objekt dann andere Nutzer des Objekts wird Sie die änderungen sehen, aber wenn Sie binden Sie den Namen in dieses Modul dann, dass betrifft nur die lokalen Namen, es ändert sich nichts in der original-Modul.
Stattdessen müssen Sie erneut binden die variable in einem anderen Modul:
Außer natürlich, Sie finden, dass Sie bekommen viel besser an, wenn Sie eine Klasse erstellen, zu verwalten Ihre freigegebenen Zustand.
Ihre zweite bit der code ist ejust Missverständnis lokale und Globale Variablen:
innerhalb der Funktion, die Sie erstellt eine neue lokale variable RegDevID die nichts zu tun mit der globalen variable mit dem gleichen Namen. Verwenden Sie die
global
- Anweisung, wenn Sie möchten, binden Sie eine Globale variable:Meine Vermutung ist, dass Sie versuchen, Zugriff auf die freigegebene variable ohne
lock
. Wenn Sie nicht eine Sperre erwerben und zu Lesen versuchen eine shared-variable in einem thread, während ein anderer thread schreibt, könnte der Wert sein unbestimmt.Zu beheben, stellen Sie sicher, Sie erwerben eine Sperre im Gewinde vor dem Lesen oder schreiben.
Lesen über Python threading.
Antwort auf Ihr problem unten mit der Festlegung des lösungsumfangs:
In Ihre Bodenprobe, die Sie erleben ein problem mit der Festlegung des lösungsumfangs. In
SetVar()
sind Sie ein label erstellenRegDevID
lokal zu der Funktion. InGetVar()
Sie versucht zu Lesen, von einem labelRegDevID
aber es ist nicht definiert. Also, es sieht höher in Umfang und findet, definiert man in den import. Die Variablen müssen in dem gleichen Umfang, wenn Sie hoffen, dass Sie auf den gleichen Daten.Lesen Sie über die scoping.