Considere 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 (). Inicio (); T (). Inicio ()
Me llaman desde Thread-2
Estoy llamado desde Thread-1
Aquí threading.local () se usa como una forma rápida y sucia de pasar algunos datos de run () a bar () sin cambiar la interfaz de foo ().
Tenga en cuenta que el uso de variables globales no funcionará:
#/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 (). Inicio (); T (). Inicio ()
Me llaman desde Thread-2
Me llaman desde Thread-2
Mientras tanto, si pudiera permitirse pasar estos datos como un argumento de foo (), sería una forma más elegante y bien diseñada:
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 se usa código de terceros o mal diseñado.