並行処理
複数のタスクを同時に実行する仕組み。
スレッド
軽量な並行処理の仕組み。
マルチプロセス
複数のプロセスを使用する並行処理。
asyncio
非同期I/O向けの並行処理ライブラリ。
並行処理
複数のタスクを同時に実行する仕組み。
GIL
Global Interpreter Lock。Pythonのスレッド制限。
async/await
非同期処理の構文。
スレッド
なぜスレッドが必要か?
スレッドは、I/Oバウンドなタスクを効率的に実行するのに適しています。これにより、処理速度を向上できます。
いつ使うか?
- I/Oバウンドなタスクを実行する場合
- 軽量な並行処理が必要な場合
- メモリ効率を向上する場合
- 同じプロセス内で並行処理を行う場合
実践テクニック
GILを理解する
GIL(Global Interpreter Lock)を理解することで、Pythonのスレッド制限を把握できます。これにより、CPUバウンドなタスクにはマルチプロセスを検討できます。
スレッドセーフなコードを書く
スレッドセーフなコードを書くことで、データの競合を防ぐことができます。これにより、バグを防ぐことができます。
# スレッドの基本import threadingimport time
def worker(num): print(f"Worker {num} started") time.sleep(2) print(f"Worker {num} finished")
# スレッドの作成と実行threads = []for i in range(5): thread = threading.Thread(target=worker, args=(i,)) threads.append(thread) thread.start()
# スレッドの待機for thread in threads: thread.join()
print("All workers finished")マルチプロセス
なぜマルチプロセスが必要か?
マルチプロセスは、CPUバウンドなタスクを効率的に実行するのに適しています。これにより、処理速度を向上できます。
いつ使うか?
- CPUバウンドなタスクを実行する場合
- GILの制限を回避する場合
- 複数のCPUコアを活用する場合
- 独立なプロセスで並行処理を行う場合
実践テクニック
プロセス間通信を使う
プロセス間通信(Queue、Pipe)を使うことで、プロセス間でデータを共有できます。これにより、複雑な並行処理を実装できます。
プロセスプールを使う
プロセスプールを使うことで、プロセスの作成と管理を効率化できます。これにより、リソース管理を向上できます。
# マルチプロセスの基本import multiprocessingimport time
def worker(num): print(f"Worker {num} started") time.sleep(2) print(f"Worker {num} finished")
# プロセスの作成と実行processes = []for i in range(5): process = multiprocessing.Process(target=worker, args=(i,)) processes.append(process) process.start()
# プロセスの待機for process in processes: process.join()
print("All workers finished")asyncio
なぜasyncioが必要か?
asyncioは、非同期I/O操作を効率的に処理するのに適しています。これにより、処理速度を向上できます。
いつ使うか?
- 非同期I/O操作を行う場合
- 大量のI/O操作を効率的に処理する場合
- イベントループベースの並行処理が必要な場合
- コルーチンやタスクを活用する場合
実践テクニック
async/awaitを使う
async/awaitを使うことで、非同期処理を簡潔に記述できます。これにより、コードの可読性を向上できます。
イベントループを使う
イベントループを使うことで、非同期タスクを効率的にスケジューリングできます。これにより、処理速度を向上できます。
# asyncioの基本import asyncio
async def worker(num): print(f"Worker {num} started") await asyncio.sleep(2) print(f"Worker {num} finished")
async def main(): # タスクの作成と実行 tasks = [worker(i) for i in range(5)] await asyncio.gather(*tasks) print("All workers finished")
# イベントループの実行asyncio.run(main())合格ライン
スレッドを使える
マルチプロセスを使える
asyncioを使える
並行処理の使い分けができる
演習課題
課題1: スレッドの作成
スレッドを使って、並行処理を実装してください。
課題2: マルチプロセスの作成
マルチプロセスを使って、並行処理を実装してください。
課題3: asyncioの作成
asyncioを使って、非同期処理を実装してください。
参考文献
この記事は以下の公的ガイドライン/標準に基づいています。
- threading - Python Library - 公式ドキュメント
- multiprocessing - Python Library - 公式ドキュメント
- asyncio - Python Library - 公式ドキュメント