Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 同期と通信 | Multithreading vs. Multiprocessing
Python構造化プログラミング

同期と通信

メニューを表示するにはスワイプしてください

スレッドやプロセスを扱う際には、データの共有や動作の調整が必要になることが多い。適切な同期を行わないと、2つのスレッドが同時に同じ変数を更新しようとして、**競合状態(race conditions)**と呼ばれる予測不能な結果が発生する可能性がある。これを防ぐために、Python では ロック(lock)キュー(queue)共有メモリ(shared memory) などの同期プリミティブが提供されている。

ロックは、同時に1つのスレッドだけが特定のコードやデータにアクセスできるようにするシンプルな仕組み。1つのスレッドがロックを取得すると、他のスレッドはそのロックが解放されるまで待機する必要がある。これにより、複数のスレッドによる競合的な変更を防ぐことができる。

キューは、スレッドやプロセス間で安全にデータをやり取りするための強力なツール。キューを使うことで、あるスレッドやプロセスがデータを安全に投入し、別のスレッドやプロセスがそれを取り出すことができる。queue.Queue クラス(スレッド用)や multiprocessing.Queue(プロセス用)は、内部で必要なロック処理をすべて行うため、競合状態を心配する必要がない。

共有メモリを使うと、プロセス間で同じデータに直接アクセスできるが、競合を避けるためにロックやセマフォなどの同期プリミティブを利用する必要がある。多くの場合、プロセス間通信にはキューを使う方が簡単かつ安全である。

上記の動画では、ロックによって2つのスレッドが共有データを破壊するのを防ぐ方法や、キューを使って並行タスク間で安全にデータを受け渡す方法を示している。

1234567891011121314151617181920212223
import 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.
question mark

Python で複数のスレッド間でデータを安全に共有するために使用する同期プリミティブはどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  6

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  6
some-alt