Pythonでconcurrent.futuresを用いた並列処理の実践方法

この記事では、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の並列処理を簡単かつ効率的に行うための強力なツールです。基本的な使い方から応用例まで、この記事で詳しく解説しました。是非ともこの機会に、並列処理のスキルを磨いてみてください。

コメント

コメントする

目次