다음 코드를 고려하십시오.
#/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 ()
Thread-2에서 전화를 받았습니다.
나는 Thread-1에서 호출되었습니다.
여기서 threading.local ()은 foo ()의 인터페이스를 변경하지 않고 run ()에서 bar ()로 일부 데이터를 전달하는 빠르고 더러운 방법으로 사용됩니다.
전역 변수를 사용하는 것은 트릭을 수행하지 않습니다.
#/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 ()
Thread-2에서 전화를 받았습니다.
Thread-2에서 전화를 받았습니다.
한편,이 데이터를 foo ()의 인수로 전달할 여유가 있다면 더 우아하고 잘 설계된 방법이 될 것입니다.
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())
그러나 타사 또는 잘못 설계된 코드를 사용할 때 항상 가능한 것은 아닙니다.