Hãy xem xét đoạn mã sau:
#/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 ()
Tôi được gọi từ Thread-2
Tôi được gọi từ Thread-1
Ở đây threading.local () được sử dụng như một cách nhanh chóng và dễ dàng để chuyển một số dữ liệu từ run () sang bar () mà không làm thay đổi giao diện của foo ().
Lưu ý rằng việc sử dụng các biến toàn cục sẽ không thực hiện được mẹo:
#/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 ()
Tôi được gọi từ Thread-2
Tôi được gọi từ Thread-2
Trong khi đó, nếu bạn có đủ khả năng chuyển dữ liệu này qua như một đối số của foo () - thì đó sẽ là một cách thanh lịch và được thiết kế tốt hơn:
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())
Nhưng điều này không phải lúc nào cũng khả thi khi sử dụng mã của bên thứ ba hoặc được thiết kế kém.