Perhatikan kode berikut:
#/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 (). Mulai ()
Saya dipanggil dari Thread-2
Saya dipanggil dari Thread-1
Di sini threading.local () digunakan sebagai cara cepat dan kotor untuk meneruskan beberapa data dari run () ke bar () tanpa mengubah antarmuka foo ().
Perhatikan bahwa menggunakan variabel global tidak akan berhasil:
#/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 (). Mulai ()
Saya dipanggil dari Thread-2
Saya dipanggil dari Thread-2
Sementara itu, jika Anda mampu meneruskan data ini sebagai argumen foo () - itu akan menjadi cara yang lebih elegan dan dirancang dengan baik:
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())
Tetapi ini tidak selalu memungkinkan saat menggunakan kode pihak ketiga atau yang dirancang dengan buruk.