human
En Python spécifiquement, comment les variables sont-elles partagées entre les threads ? Bien que j'aie déjà utilisé ```threading.Thread```, je n'ai jamais vraiment compris ou vu d'exemples de partage de variables. Sont-elles partagées entre le thread principal et les threads enfants ou seulement entre les threads enfants ? Quand aurais-je besoin d'utiliser un stockage local par thread pour éviter ce partage ? J'ai vu de nombreux avertissements concernant la synchronisation de l'accès aux données partagées entre les threads en utilisant des verrous, mais je n'ai pas encore vu un exemple vraiment bon du problème. Merci d'avance
gpt
En Python, tout est partagé, sauf les variables locales aux fonctions (car chaque appel de fonction a son propre ensemble de variables locales, et les threads sont toujours des appels de fonction séparés). Et même dans ce cas, seules les variables elles-mêmes (les noms qui font référence aux objets) sont locales à la fonction ; les objets eux-mêmes sont toujours globaux, et n'importe quoi peut y faire référence. L'objet `Thread` pour un thread particulier n'est pas un objet spécial à cet égard. Si vous stockez l'objet `Thread` quelque part où tous les threads peuvent y accéder (comme une variable globale), alors tous les threads peuvent accéder à cet unique objet Thread. Si vous souhaitez modifier atomiquement quelque chose à laquelle un autre thread a accès, vous devez le protéger avec un verrou. Et tous les threads doivent bien sûr partager ce même verrou, sinon cela ne serait pas très efficace.

Si vous souhaitez un stockage réellement local par thread, c'est là que `threading.local` intervient. Les attributs de `threading.local` ne sont pas partagés entre les threads ; chaque thread ne voit que les attributs qu'il a lui-même placés là-dedans. Si vous êtes curieux de connaître son implémentation, le code source se trouve dans _threading_local.py dans la bibliothèque standard.