threading.local()は、以下のように考えるとわかりやすい。
仮に、オプジェクトの内部構造を見るinternalという関数があったとしよう。
threading.local()を呼ぶと、ディクショナリを持った新しいオプジェクトが作られる。
>>>tss1 = threading.local()
>>>internal(tss1.__dict__)
{}
tss1に値をセットすると、自動的に、スレッド番号をキーとしたサブディクショナリへ値がセットされる。仮にスレッド番号が9056とすると、
>>>tss1.val = 10
>>>internal(tss1.__dict__)
{9056: {'val': 10}}
>>>tss1.val
10
違うスレッドから値valをセットすると、違うサブディクショナリへセットされる。
>>>tss1.val = 20
>>>internal(tss1.__dict__)
{9056: {'val': 10}, 1026: {'val', 20}}
>>>tss1.val
20
threading.local()は、呼ぶたびに別のディクショナリが作られる。
>>>tss1 = threading.local()
>>>tss1.val = "hello"
>>>tss2 = threading.local()
>>>tss2.val = "world"
>>>tss1.val
hello
>>>tss2.val
world
以下の解釈は間違い。
・threading.local()は、最初からどこかに存在するTSSを指すポインタを返す。よって、何度threading.local()を呼んでも、同じデータにアクセスする事ができる。
・threading.local()は、毎回同じグローバルなオブジェクトを返してくる。
0 件のコメント:
コメントを投稿