พิจารณารหัสต่อไปนี้:
#/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 () ใช้เป็นวิธีที่รวดเร็วและสกปรกในการส่งผ่านข้อมูลบางส่วนจาก run () ไปยัง bar () โดยไม่ต้องเปลี่ยนอินเทอร์เฟซของ foo ()
โปรดทราบว่าการใช้ตัวแปรส่วนกลางจะไม่ทำเคล็ดลับ:
#/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())
แต่ไม่สามารถทำได้เสมอไปเมื่อใช้รหัสของบุคคลที่สามหรือรหัสที่ออกแบบมาไม่ดี