Heim  >  Artikel  >  Backend-Entwicklung  >  Notizen zur Python-Studie – ThreadLocal

Notizen zur Python-Studie – ThreadLocal

高洛峰
高洛峰Original
2017-02-16 11:03:011320Durchsuche

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!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn