[Python] 原來 threading.local() 不是全域的…

[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() 本身是全域屬性的,

經此一事才發現誤解不小,要很小心呀~

(本頁面已被瀏覽過 18 次)

發表迴響

你的電子郵件位址並不會被公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料