Wenn wir Multithread-Programme schreiben, stoßen wir häufig auf zwei Arten von Variablen.
Eine davon ist eine globale Variable, die von mehreren Threads gemeinsam genutzt wird. Um eine Verhaltensänderung zu vermeiden, haben wir bereits erwähnt, dass eine Sperre erforderlich ist.
Eine davon sind lokale Variablen. Wird nur von einem Thread verwendet und Threads beeinflussen sich nicht gegenseitig.
Zum Beispiel ist die in der Funktion task()
im folgenden Programm definierte Variable count
eine lokale Variable. Selbst wenn wir zwei Threads erstellen, wirken sich die count
-Inkremente beider nicht gegenseitig aus, da count
in task
definiert ist.
import threading def task(): count = 0 for i in range(1000): count += 1 print count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
Ist es also perfekt, so damit umzugehen? Noch nicht.
Das obige Beispiel ist sehr einfach, aber wenn wir auf eine komplexere Geschäftslogik stoßen, wie z. B. mehrere lokale Variablen, mehrere Funktionsaufrufe usw., wird es schwierig, lokale Variablen auf diese Weise zu definieren.
Mehrere Funktionsaufrufe beziehen sich beispielsweise auf:
Wir haben eine Funktion definiert, MethodeA(), dieser Methodenkörper ruft MethodeB() auf, der Methodenkörper von MethodeB() ruft MethodeC() auf...
Wenn wir Wenn wir methodA() in einem Thread aufrufen und eine Variable attr verwenden, müssen wir attr Schicht für Schicht an nachfolgende Funktionen übergeben.
Gibt es eine Möglichkeit, eine Variable in einem Thread zu definieren und dann alle Funktionen in diesem Thread aufzurufen? Das ist einfach und klar?
Python erledigt das für uns, das ist ThreadLocal.
Die Verwendung von ThreadLocal erfordert nur drei Schritte:
Definieren Sie ein Objekt threading.local
Parameter an das Objekt innerhalb des Threads binden. Alle gebundenen Parameter sind threadisoliert.
wird innerhalb eines Threads aufgerufen.
Der Code ist unten dargestellt:
# coding=utf-8 import threading local = threading.local() # 创建一个全局的对象 def task(): local.count = 0 # 初始化一个线程内变量,该变量线程间互不影响。 for i in range(1000): count_plus() def count_plus(): local.count += 1 print threading.current_thread().name, local.count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
Weitere Hinweise zum Python-Lernen - ThreadLocal-bezogene Artikel finden Sie auf der chinesischen PHP-Website!