同期と通信
メニューを表示するにはスワイプしてください
スレッドやプロセスを扱う際には、データの共有や動作の調整が必要になることが多い。適切な同期を行わないと、2つのスレッドが同時に同じ変数を更新しようとして、**競合状態(race conditions)**と呼ばれる予測不能な結果が発生する可能性がある。これを防ぐために、Python では ロック(lock)、キュー(queue)、共有メモリ(shared memory) などの同期プリミティブが提供されている。
ロックは、同時に1つのスレッドだけが特定のコードやデータにアクセスできるようにするシンプルな仕組み。1つのスレッドがロックを取得すると、他のスレッドはそのロックが解放されるまで待機する必要がある。これにより、複数のスレッドによる競合的な変更を防ぐことができる。
キューは、スレッドやプロセス間で安全にデータをやり取りするための強力なツール。キューを使うことで、あるスレッドやプロセスがデータを安全に投入し、別のスレッドやプロセスがそれを取り出すことができる。queue.Queue クラス(スレッド用)や multiprocessing.Queue(プロセス用)は、内部で必要なロック処理をすべて行うため、競合状態を心配する必要がない。
共有メモリを使うと、プロセス間で同じデータに直接アクセスできるが、競合を避けるためにロックやセマフォなどの同期プリミティブを利用する必要がある。多くの場合、プロセス間通信にはキューを使う方が簡単かつ安全である。
上記の動画では、ロックによって2つのスレッドが共有データを破壊するのを防ぐ方法や、キューを使って並行タスク間で安全にデータを受け渡す方法を示している。
1234567891011121314151617181920212223import threading counter = 0 lock = threading.Lock() def increment(): global counter for _ in range(10000): with lock: # Ensuring only one thread enters this block at a time counter += 1 threads = [] for _ in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print("Final counter value:", counter) # Without the lock, the final value would likely be wrong due to race conditions. # With the lock, the result is always correct: 50000.
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください