threading.local()
en Python se utiliza para crear variables locales a un hilo. Esto significa que cada hilo tiene su propia copia de la variable, y los cambios realizados en esa variable por un hilo no afectan a otros hilos. Es útil cuando necesitas almacenar datos que son específicos para cada hilo, como datos de sesión o configuraciones temporales.Los datos creados mediante threading.local() son propios de los hilos (incluido el hilo principal). Veamos como dato funciona como una variable diferente para cada hilo.
|
En este ejemplo incluimos la espera el hilo principal para que todos los hilos terminen.
import threading
# Crear un objeto local para el hilo
local_data = threading.local()
def process_data():
# Asignar un valor a la variable local del hilo
local_data.value = threading.current_thread().name
print(f"Valor en {local_data.value}: {id(local_data.value)} : {id(local_data)}")
# Crear varios hilos
threads = []
for i in range(5):
thread = threading.Thread(target=process_data, name=f"Hilo-{i}")
threads.append(thread)
thread.start()
# Esperar a que todos los hilos terminen
for thread in threads:
thread.join()
Valor en Hilo-0: 137848841591536 : 137848228173904 Valor en Hilo-1: 137848841589040 : 137848228173904 Valor en Hilo-2: 137848841596336 : 137848228173904 Valor en Hilo-3: 137848841593328 : 137848228173904 Valor en Hilo-4: 137848841590128 : 137848228173904
import threading
import random
def mostrar(d):
try:
val = d.valor
except AttributeError:
print(f"{threading.current_thread().name}: Aún no inicializado\n", end="")
else:
print(f"{threading.current_thread().name}: {val}\n", end="")
def hilo(dato):
mostrar(dato)
dato.valor = random.randint(1, 100)
mostrar(dato)
dato = threading.local() #variable con instancia local en cada hilo
mostrar(dato)
dato.valor = 999
mostrar(dato)
for i in range(3):
t = threading.Thread(target=hilo, args=(dato,))
t.start()
PS C:\PROGRAMACION\PYTHON\T2.HILOS> c:; cd 'c:\PROGRAMACION\PYTHON\T2.HILOS'; & 'C:\Users\juanj\AppData\Local\Microsoft\WindowsApps\python3.11.exe' 'c:\Users\juanj\.vscode\extensions\ms-python.python-2023.20.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '57589' '--' 'C:\PROGRAMACION\PYTHON\T2.HILOS\hilo6.py'
MainThread: Aún no inicializado
MainThread: 999
Thread-6 (hilo): Aún no inicializado
Thread-7 (hilo): Aún no inicializado
Thread-6 (hilo): 35
Thread-7 (hilo): 35
Thread-8 (hilo): Aún no inicializado
Thread-8 (hilo): 38
PS C:\PROGRAMACION\PYTHON\T2.HILOS> c:; cd 'c:\PROGRAMACION\PYTHON\T2.HILOS'; & 'C:\Users\juanj\AppData\Local\Microsoft\WindowsApps\python3.11.exe' 'c:\Users\juanj\.vscode\extensions\ms-python.python-2023.20.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '57607' '--' 'C:\PROGRAMACION\PYTHON\T2.HILOS\hilo6.py'
MainThread: Aún no inicializado
MainThread: 999
Thread-6 (hilo): Aún no inicializado
Thread-7 (hilo): Aún no inicializado
Thread-8 (hilo): Aún no inicializado
Thread-6 (hilo): 41
Thread-8 (hilo): 84
Thread-7 (hilo): 62
PS C:\PROGRAMACION\PYTHON\T2.HILOS>
Se puede comprobar que los valores son distintos para cada instancia y la variable no tiene ningún valor porque no es inicializada hasta que se le haga una asignación por primera vez dentro del hilo.
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):
data.v = self.name
foo()
T().start(); T().start(); T().start()
I'm called from Thread-37 I'm called from Thread-38 I'm called from Thread-39