この記事では、Pythonで使用できる`concurrent.futures`モジュールを用いた並列処理について深掘りします。具体的なコード例、その解説、応用例についても詳しく説明します。
なぜ並列処理が必要なのか
現代のコンピュータはマルチコアが一般的になっていますが、シングルスレッドのプログラムではこれを活かしきれません。高負荷な作業を効率よくこなすためには、並列処理が避けられません。
`concurrent.futures`とは
`concurrent.futures`はPython標準ライブラリであり、非同期実行を抽象化したインターフェイスを提供します。ThreadPoolExecutorとProcessPoolExecutorが主なクラスであり、それぞれスレッド、プロセスを使った並列処理が可能です。
基本的な使い方
from concurrent.futures import ThreadPoolExecutor
def task(n):
return n * 2
with ThreadPoolExecutor() as executor:
future = executor.submit(task, 5)
result = future.result()
print("結果:", result)
この基本的な例では、`task`関数が与えられた数値を2倍にしています。`ThreadPoolExecutor`を用いてこの関数を並列で実行しています。
コード解説
1. `ThreadPoolExecutor`クラスをインポートします。
2. 2倍の計算を行う`task`関数を定義します。
3. `with`文を使い、`ThreadPoolExecutor`のコンテキストを作成します。
4. `submit`メソッドで`task`関数を呼び出します。
5. `result()`メソッドで結果を受け取ります。
応用例
複数のタスクを並列実行
from concurrent.futures import ThreadPoolExecutor
def task(n):
return n * 2
tasks = [1, 2, 3, 4, 5]
with ThreadPoolExecutor() as executor:
results = list(executor.map(task, tasks))
print("結果:", results)
コード解説
1. `task`関数は前と同じです。
2. `tasks`リストに対して`task`関数を適用します。
3. `executor.map`メソッドで複数のタスクを並列実行します。
4. 結果はリストとして`results`に格納されます。
例外処理を含む場合
from concurrent.futures import ThreadPoolExecutor
def task(n):
if n == 0:
raise ValueError("0は入力できません")
return 10 / n
with ThreadPoolExecutor() as executor:
try:
future = executor.submit(task, 0)
result = future.result()
except Exception as e:
print("例外が発生:", e)
コード解説
1. `task`関数で0を入力とした場合、例外を発生させます。
2. `submit`と`result`で例外を捉え、エラーメッセージを出力します。
まとめ
`concurrent.futures`モジュールはPythonの並列処理を簡単かつ効率的に行うための強力なツールです。基本的な使い方から応用例まで、この記事で詳しく解説しました。是非ともこの機会に、並列処理のスキルを磨いてみてください。
コメント