Considérons le code suivant:
#/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()
Je suis appelé à partir du Fil-2
Je suis appelé à partir de Fil-1
Ici le filetage.local() est utilisé comme une façon rapide et sale de transmettre certaines données à partir de run() de la barre (de), sans changer l'interface de foo().
Notez que l'utilisation de variables globales ne suffit pas:
#/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()
Je suis appelé à partir du Fil-2
Je suis appelé à partir du Fil-2
En attendant, si vous pouvez vous permettre de passer ces données sous la forme d'un argument de foo() - il serait plus élégant et bien conçu de manière à:
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())
Mais ce n'est pas toujours possible lors de l'utilisation de tiers ou mal conçus code.