Maison  >  Article  >  développement back-end  >  notes d'étude python - ThreadLocal

notes d'étude python - ThreadLocal

高洛峰
高洛峰original
2017-02-16 11:03:011316parcourir

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 !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn