次のコードを検討してください。
#/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()
スレッド2から呼び出されます
スレッド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()
スレッド2から呼び出されます
スレッド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())
しかし、サードパーティのコードや設計が不十分なコードを使用している場合、これは常に可能とは限りません。