Consideremos el siguiente código:
#/usr/bin/env python
from time import sleep
from random import random
from threading import Thread, local
data = local()
def bar():
print("I'm called from", data.v)
def foo():
bar()
class T(Thread):
def run(self):
sleep(random())
data.v = self.getName() # Thread-1 and Thread-2 accordingly
sleep(1)
foo()
>> T().start(); T().start()
I'm called from Thread-2
I'm called from Thread-1
Aquí threading.local() se utiliza como una manera rápida y sucia para pasar algunos datos de run() a la barra() sin cambiar la interfaz de foo().
Tenga en cuenta que el uso de variables globales no hará el truco:
#/usr/bin/env python
from time import sleep
from random import random
from threading import Thread
def bar():
global v
print("I'm called from", v)
def foo():
bar()
class T(Thread):
def run(self):
global v
sleep(random())
v = self.getName() # Thread-1 and Thread-2 accordingly
sleep(1)
foo()
>> T().start(); T().start()
I'm called from Thread-2
I'm called from Thread-2
Mientras tanto, si usted puede permitirse pasar estos datos a través como un argumento de foo() - que sería una más elegante y forma bien diseñado:
from threading import Thread
def bar(v):
print("I'm called from", v)
def foo(v):
bar(v)
class T(Thread):
def run(self):
foo(self.getName())
Pero esto no siempre es posible cuando el uso de terceros o código mal diseñado.
El título no coincide con la pregunta. La cuestión es compartir variables entre hilos, el título implica que es específicamente sobre el almacenamiento local de subprocesos – Casebash
@Casebash: a partir del sonido de esta pregunta, Mike leyó que TLS es necesario para evitar los problemas causados por los datos compartidos, pero era No está claro qué datos se compartieron por defecto, con qué se compartió y cómo se compartió. He ajustado el título para que coincida mejor con la pregunta. – Shog9