什麼是 threading.local()
透過創建 threading.local() 我們可以建立 thread 的 local storage
local 物件為 thread-specific,每個 thread 的值各自獨立,不會互影響
實際看程式碼的效果可能比較好懂 local 物件能做到什麼
import threading
from time import sleep
box = threading.local()
box.x = 0
def fun(x):
box.x = x
sleep(1)
print(f"{threading.current_thread().name}: {box.x}")
t_a = threading.Thread(name="Thread A", target=fun, args=(1,))
t_b = threading.Thread(name="Thread B", target=fun, args=(2,))
t_a.start()
t_b.start()
t_a.join()
t_b.join()
print(f"{threading.current_thread().name}: {box.x}")
結果:
上面這個範例程式總共有三個 thread:Thread A, Thread B 和 MainThread
每個 thread 都有存取修改 box.x ,但作的修改不會影響到其他 thread 讀取 box.x 到的值
雖然程式碼看起來是存取同個值,但實際各 thread 存取的空間是不同,更新值也不會彼此影響,這就是 local 物件的效果
上一章:[Python] Multithreading (3):Race Condition 與 Thread-Safe
下一章:[Python] Multithreading (5):concurrent.futures.ThreadPoolExecutor 介紹
沒有留言:
張貼留言