[解決済み] Pythonの「スレッドローカルストレージ」とは何ですか、そしてなぜそれが必要なのですか?
質問
Pythonでは、特に、変数はスレッド間でどのように共有されるのでしょうか?
私は
threading.Thread
を使用したことがありますが、変数がどのように共有されるのか、本当に理解していませんでしたし、例も見たことがありませんでした。 メインスレッドと子スレッドの間で共有されるのでしょうか、それとも子スレッドの間だけで共有されるのでしょうか?この共有を避けるために、いつスレッド ローカル ストレージを使用する必要があるのでしょうか?
ロックを使用してスレッド間で共有データへのアクセスを同期させることについての多くの警告を見たことがありますが、この問題の本当に良い例をまだ見たことがありません。
事前にありがとうございます!
どのように解決するのですか?
Pythonでは、関数ローカル変数以外はすべて共有されます(各関数呼び出しが独自のローカルセットを取得し、スレッドは常に別々の関数呼び出しになるため)。そしてその場合でも、変数自体 (オブジェクトを参照する名前) だけが関数にローカルです。オブジェクト自体は常にグローバルで、何でもそれらを参照することができます。
そのため
Thread
オブジェクトは、この点では特別なオブジェクトではありません。もし、あなたが
Thread
オブジェクトをすべてのスレッドがアクセスできる場所 (グローバル変数のようなもの) に格納すれば、すべてのスレッドがその 1 つの
Thread
オブジェクトにアクセスできます。をアトミックに変更したい場合
何でも
を変更したい場合、それをロックで保護する必要があります。そして、すべてのスレッドはもちろんこのまったく同じロックを共有しなければならず、さもなければあまり効果的ではありません。
実際にスレッドローカルストレージが必要な場合、そこで
threading.local
の出番です。の属性は
threading.local
の属性はスレッド間で共有されません。各スレッドは自分自身がそこに配置した属性だけを見ます。もしあなたがその実装に興味があるなら、ソースは
_threading_local.py にあります。
にあります。
関連
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] バブルソートの宿題
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] Python 言語を決定するには?
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?