Betrachten Sie den folgenden Code:
#/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 ()
Ich werde von Thread-2 angerufen
Ich werde von Thread-1 angerufen
Hier wird threading.local () als schnelle und schmutzige Methode verwendet, um einige Daten von run () an bar () zu übergeben, ohne die Schnittstelle von foo () zu ändern.
Beachten Sie, dass die Verwendung globaler Variablen nicht ausreicht:
#/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 ()
Ich werde von Thread-2 angerufen
Ich werde von Thread-2 angerufen
Wenn Sie es sich leisten könnten, diese Daten als Argument von foo () weiterzugeben, wäre dies eine elegantere und besser gestaltete Methode:
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())
Dies ist jedoch nicht immer möglich, wenn Sie Code von Drittanbietern oder schlecht gestalteten verwenden.