Maison > Article > développement back-end > notes d'étude python - ThreadLocal
Lorsque nous écrivons des programmes multi-thread, nous rencontrons souvent deux types de variables.
One est une variable globale, partagée par plusieurs threads. Afin d'éviter de modifier le comportement, nous avons mentionné précédemment que le verrouillage est nécessaire.
L'une concerne les variables locales. Utilisé uniquement par un seul thread, et les threads ne s'affectent pas les uns les autres.
Par exemple, la variable task()
définie dans la fonction count
du programme suivant est une variable locale. Même si nous créons deux fils de discussion, les incréments count
des deux ne s'affecteront pas car count
est défini dans task
.
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()
Alors, est-ce la solution parfaite ? Pas encore.
L'exemple ci-dessus est très simple, mais lorsque nous rencontrons une logique métier plus complexe, telle que plusieurs variables locales, plusieurs appels de fonction, etc., définir des variables locales de cette manière deviendra un problème.
Les appels de fonction multiples font référence, par exemple :
Nous avons défini une fonction, méthodeA(), ce corps de méthode appelle méthodeB(), le corps de méthode méthodeB() appelle méthodeC()...
Si nous appelez methodA() dans un thread et utilisez une variable attr, nous devons alors transmettre attr aux fonctions suivantes couche par couche.
Existe-t-il un moyen qui nous permet de définir une variable dans un thread, et ensuite toutes les fonctions de ce thread peuvent être appelées ? C'est simple et clair ?
Python le fait pour nous, c'est ThreadLocal.
L'utilisation de ThreadLocal ne nécessite que trois étapes :
Définir un objet threading.local
Lier les paramètres à l'objet dans le fil de discussion. Tous les paramètres liés sont isolés du thread.
est appelé dans un fil de discussion.
Le code est affiché ci-dessous :
# 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()
Pour plus de notes d'étude sur Python - Articles liés à ThreadLocal, veuillez faire attention au site Web PHP chinois !