2021年11月16日 星期二

[Python] Threading (4):threading.local() 介紹

 

什麼是 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 介紹


沒有留言:

張貼留言