並列処理入門
社内の勉強会で、「並列処理」についての話があったので、アウトプットのために基礎的な部分をまとめて記事にしました。
並列処理とは?
並列処理は、複数のタスクを同時に実行する技術で、主に以下のような場面で役立ちます。
- 処理のスピードアップ: 複数の作業を同時に行うことで、全体の処理時間を短縮する
- リアルタイム性の向上: タスクを分散して実行し、応答性を高める
- システムリソースの有効活用: CPUやGPUの性能を最大限に引き出す
実装例:Pythonでの簡単な並列処理
Pythonを用いて、以下に簡単な例を示します。
実装例: 並列処理で複数のタスクを実行する
以下は、5つのタスクを並列に実行し、それぞれが完了するのを待つプログラムです。
コード例
import threading
import time
# タスクの定義
def task(name, duration):
print(f"Task {name} is starting.")
time.sleep(duration) # 処理にかかる時間をシミュレート
print(f"Task {name} is finished.")
# スレッドのリスト
threads = []
# 複数のタスクをスレッドで実行
for i in range(5):
t = threading.Thread(target=task, args=(f"Task-{i+1}", 2))
threads.append(t)
t.start()
# 全てのタスクが完了するまで待つ
for t in threads:
t.join()
print("All tasks are completed!")
実装例の解説
1. threadingモジュール
Python標準ライブラリのthreadingを使ってスレッドを作成しています。このモジュールを使うことで、複数のタスクを同時に実行できます。
2. task関数
タスクごとに異なる名前と実行時間を受け取り、処理をシミュレートします。
3. スレッドの生成と開始
threading.Threadクラスを使ってタスクをスレッドに割り当て、start()メソッドで実行を開始します。
4. タスクの完了待機
join()メソッドを呼び出すことで、すべてのスレッドが終了するのを待ちます。これにより、全タスクが完了してから次の処理に進みます。
実行結果
上記のコードを実行すると、以下のような結果が得られます。
Task Task-1 is starting.
Task Task-2 is starting.
Task Task-3 is starting.
Task Task-4 is starting.
Task Task-5 is starting.
Task Task-1 is finished.
Task Task-2 is finished.
Task Task-3 is finished.
Task Task-4 is finished.
Task Task-5 is finished.
All tasks are completed!
すべてのタスクが2秒間の処理時間を経て終了しますが、タスクが並列に実行されるため、全体の処理時間は約2秒です(5タスクを順次実行した場合、10秒かかります)。
勉強会の中では、スレッドとプロセスについての説明がありましたが、今回はスレッドを用いた並列処理を実装を通して経験しました。
並列処理を使うときの注意点
1. データ競合に注意
複数のスレッドが同じデータに同時にアクセスすると、予期しない結果になることがあります。必要に応じて、LockやSemaphoreを使用する。
2. オーバーヘッド
並列化に伴う管理コストが発生するため、タスクが軽量であればかえって遅くなる場合もある。
3. 適切な設計が必要
並列処理の設計ミスは、バグやパフォーマンス低下につながります。
まとめ
今回は、初歩的な内容のアウトプットと、簡単な実装で並列処理の概要を掴むことにトライしました。引き続き学習を続けて、より深い内容の理解にもチャレンジします。