特に Python では、変数はスレッド間でどのように共有されるのでしょうか?
以前使用したことはありますが、threading.Thread
変数がどのように共有されるのかを実際に理解したり、例を見たりしたことはありませんでした。変数はメイン スレッドと子の間で共有されるのでしょうか、それとも子の間でのみ共有されるのでしょうか。この共有を回避するためにスレッド ローカル ストレージを使用する必要があるのはいつでしょうか。
ロックを使用してスレッド間で共有データへのアクセスを同期することに関する警告は数多く目にしてきましたが、問題の本当に良い例はまだ見たことがありません。
ベストアンサー1
Python では、関数ローカル変数を除いてすべてが共有されます (関数呼び出しごとにローカル変数のセットが与えられ、スレッドは常に個別の関数呼び出しであるため)。また、関数ローカル変数であっても、変数自体 (オブジェクトを参照する名前) のみが関数に対してローカルです。オブジェクト自体は常にグローバルであり、どこからでも参照できます。Thread
特定のスレッドのオブジェクトは、この点では特別なオブジェクトではありません。オブジェクトをすべてのスレッドがアクセスできる場所 (グローバル変数など) に保存すると、すべてのスレッドがその 1 つのオブジェクトThread
にアクセスできます。Thread
何でも別のスレッドがアクセスできる場合は、ロックで保護する必要があります。そして、もちろんすべてのスレッドがこの同じロックを共有する必要があります。そうしないと、あまり効果的ではありません。
実際にスレッドローカルなストレージが必要な場合は、ここがthreading.local
役に立ちます。 の属性はthreading.local
スレッド間で共有されません。各スレッドは、そこに配置した属性のみを参照します。実装に興味がある場合は、ソースは_threading_local.py標準ライブラリ内。