並行処理

複数のタスクを同時に実行する仕組み。

スレッド
軽量な並行処理の仕組み。
マルチプロセス
複数のプロセスを使用する並行処理。
asyncio
非同期I/O向けの並行処理ライブラリ。
並行処理
複数のタスクを同時に実行する仕組み。
GIL
Global Interpreter Lock。Pythonのスレッド制限。
async/await
非同期処理の構文。

スレッド

軽量な並行処理

スレッドは「軽量な並行処理」のようなもの。同じプロセス内で複数のスレッドを実行する仕組みです。これにより、I/Oバウンドなタスクを効率的に実行できます。

なぜスレッドが必要か?

スレッドは、I/Oバウンドなタスクを効率的に実行するのに適しています。これにより、処理速度を向上できます。

いつ使うか?

  • I/Oバウンドなタスクを実行する場合
  • 軽量な並行処理が必要な場合
  • メモリ効率を向上する場合
  • 同じプロセス内で並行処理を行う場合

実践テクニック

GILを理解する

GIL(Global Interpreter Lock)を理解することで、Pythonのスレッド制限を把握できます。これにより、CPUバウンドなタスクにはマルチプロセスを検討できます。

スレッドセーフなコードを書く

スレッドセーフなコードを書くことで、データの競合を防ぐことができます。これにより、バグを防ぐことができます。

Threading
# スレッドの基本
import threading
import 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バウンドなタスクを効率的に実行するのに適しています。これにより、処理速度を向上できます。

いつ使うか?

  • CPUバウンドなタスクを実行する場合
  • GILの制限を回避する場合
  • 複数のCPUコアを活用する場合
  • 独立なプロセスで並行処理を行う場合

実践テクニック

プロセス間通信を使う

プロセス間通信(Queue、Pipe)を使うことで、プロセス間でデータを共有できます。これにより、複雑な並行処理を実装できます。

プロセスプールを使う

プロセスプールを使うことで、プロセスの作成と管理を効率化できます。これにより、リソース管理を向上できます。

Multiprocessing
# マルチプロセスの基本
import multiprocessing
import 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

非同期I/O向けの並行処理

asyncioは「非同期I/O向けの並行処理」のようなもの。非同期I/O操作を効率的に処理するためのライブラリです。これにより、大量のI/O操作を効率的に実行できます。

なぜasyncioが必要か?

asyncioは、非同期I/O操作を効率的に処理するのに適しています。これにより、処理速度を向上できます。

いつ使うか?

  • 非同期I/O操作を行う場合
  • 大量のI/O操作を効率的に処理する場合
  • イベントループベースの並行処理が必要な場合
  • コルーチンやタスクを活用する場合

実践テクニック

async/awaitを使う

async/awaitを使うことで、非同期処理を簡潔に記述できます。これにより、コードの可読性を向上できます。

イベントループを使う

イベントループを使うことで、非同期タスクを効率的にスケジューリングできます。これにより、処理速度を向上できます。

asyncio
# 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を使って、非同期処理を実装してください。

参考文献

この記事は以下の公的ガイドライン/標準に基づいています。