[Python] 原來 threading.local() 不是全域的…
Python 裡有個 threading.local(),可以取得 thread-local storage (TLS),
也就是每個執行緒 (thread) 特有的儲存空間。
今天想要利用這個特性,在 thread 的某個地方先設定 TLS 的一個屬性,
在同 thread 的另一個地方取用它,結果卻撞到牆了,
設定的地方看來是成功的,但後面取用卻失敗,怎麼回事呢?
研究了一下,原來 threading.local() 每次產生出來的物件是獨立的,
設定在上面的屬性雖然可以確保同 thread 都取用同一份,
但前提是你必須是使用同一個 threading.local() 物件!
來看個例子吧~
我先產生一個 threading.local() 物件,
在上面設定一個屬性 x = 1,取得值也沒有問題:
>>> import threading >>> tls1 = threading.local() >>> tls1.x = 1 >>> tls1.x 1
這時我在同一個 thread,再產生一個 threading.local() 物件,
噢噢… 是無法從這個新的 threading.local() 物件看到屬性 x 的:
>>> tls2 = threading.local() >>> tls2.x Traceback (most recent call last): File "", line 1, in AttributeError: 'thread._local' object has no attribute 'x'
之前一直誤以為 threading.local() 本身是全域屬性的,
經此一事才發現誤解不小,要很小心呀~
(本頁面已被瀏覽過 1,631 次)