マルチスレッドのPythonコードでロックが不要なのはGILのせい?
2023-08-18 05:33:12
質問
Global Interpreter Lock を持つ Python の実装 (CPython など) に依存し、マルチスレッドコードを書いている場合、本当にロックは全く必要ないのでしょうか?
GILが複数の命令の並列実行を許さないのであれば、共有データの保護は不要ではないでしょうか?
馬鹿な質問で申し訳ないのですが、マルチプロセッサ/コアマシンでのPythonについていつも疑問に思っていることなのです。
同じことが、GILを持つ他のどのような言語実装にも当てはまります。
どのように解決するのですか?
スレッド間で状態を共有する場合にもロックは必要です。GIL はインタープリタを内部的に保護するだけです。独自のコードで一貫性のない更新が行われる可能性があります。
例えば
#!/usr/bin/env python
import threading
shared_balance = 0
class Deposit(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance += 100
shared_balance = balance
class Withdraw(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance -= 100
shared_balance = balance
threads = [Deposit(), Withdraw()]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print shared_balance
ここでは、共有状態を読み込む間にコードを割り込ませることができます (
balance = shared_balance
) と変更された結果を書き戻す (
shared_balance = balance
)、更新の失敗を引き起こします。その結果、共有状態にはランダムな値が設定されます。
更新を一貫したものにするために、ランメソッドはリード・モディファイ・ライトセクションの周り(ループの中)で共有状態をロックするか、または 共有状態が読み込まれてから変更されたときにそれを検出する何らかの方法 .
関連
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] バブルソートの宿題
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。