1. ホーム
  2. python

[解決済み] Pythonの「スレッドローカルストレージ」とは何ですか、そしてなぜそれが必要なのですか?

2022-09-05 06:14:53

質問

Pythonでは、特に、変数はスレッド間でどのように共有されるのでしょうか?

私は threading.Thread を使用したことがありますが、変数がどのように共有されるのか、本当に理解していませんでしたし、例も見たことがありませんでした。 メインスレッドと子スレッドの間で共有されるのでしょうか、それとも子スレッドの間だけで共有されるのでしょうか?この共有を避けるために、いつスレッド ローカル ストレージを使用する必要があるのでしょうか?

ロックを使用してスレッド間で共有データへのアクセスを同期させることについての多くの警告を見たことがありますが、この問題の本当に良い例をまだ見たことがありません。

事前にありがとうございます!

どのように解決するのですか?

Pythonでは、関数ローカル変数以外はすべて共有されます(各関数呼び出しが独自のローカルセットを取得し、スレッドは常に別々の関数呼び出しになるため)。そしてその場合でも、変数自体 (オブジェクトを参照する名前) だけが関数にローカルです。オブジェクト自体は常にグローバルで、何でもそれらを参照することができます。 そのため Thread オブジェクトは、この点では特別なオブジェクトではありません。もし、あなたが Thread オブジェクトをすべてのスレッドがアクセスできる場所 (グローバル変数のようなもの) に格納すれば、すべてのスレッドがその 1 つの Thread オブジェクトにアクセスできます。をアトミックに変更したい場合 何でも を変更したい場合、それをロックで保護する必要があります。そして、すべてのスレッドはもちろんこのまったく同じロックを共有しなければならず、さもなければあまり効果的ではありません。

実際にスレッドローカルストレージが必要な場合、そこで threading.local の出番です。の属性は threading.local の属性はスレッド間で共有されません。各スレッドは自分自身がそこに配置した属性だけを見ます。もしあなたがその実装に興味があるなら、ソースは _threading_local.py にあります。 にあります。