Pythonでスレッドプールを作成して使用する手法

この記事では、Pythonでスレッドプールを作成して使用する方法について解説します。Pythonの`concurrent.futures`モジュールを用いた基本的なスレッドプールの作成方法から、その応用例までを具体的なコードとともにご紹介します。

目次

スレッドプールとは

スレッドプールとは、事前に生成されたスレッドの集合(プール)のことです。このプールからスレッドを取り出して任意のタスクを実行することで、繰り返しスレッドを生成・破棄するコストを削減できます。特にI/Oバウンドな処理や、並列処理を行いたい場合に有用です。

Pythonでのスレッドプールの作成方法

Pythonでは`concurrent.futures.ThreadPoolExecutor`を使用してスレッドプールを作成できます。

基本的な使い方

from concurrent.futures import ThreadPoolExecutor

# スレッドプールを作成(最大スレッド数を3に設定)
with ThreadPoolExecutor(max_workers=3) as executor:
    # タスクを投げる(ここではprint関数)
    executor.submit(print, 'Hello, World!')

この例では、最大スレッド数を3に設定してスレッドプールを作成しています。`submit`メソッドでタスク(ここでは`print`関数)をスレッドプールに投げています。

複数のタスクを同時に実行

from concurrent.futures import ThreadPoolExecutor

def task(n):
    return n * 2

# スレッドプールを作成
with ThreadPoolExecutor() as executor:
    # 複数のタスクを同時に実行
    results = list(executor.map(task, [1, 2, 3, 4, 5]))

print(results)  # Output: [2, 4, 6, 8, 10]

`map`メソッドを使用して、複数のタスクを同時に実行できます。この例では、`task`関数に異なる引数を与えて並列に実行しています。

応用例

応用例1:非同期I/O操作

スレッドプールはI/Oバウンドな処理で威力を発揮します。以下は、非同期で複数のURLからデータをダウンロードする例です。

import requests
from concurrent.futures import ThreadPoolExecutor

def download(url):
    return requests.get(url).text

# スレッドプールを作成
with ThreadPoolExecutor() as executor:
    urls = ['http://example.com', 'http://example.org', 'http://example.net']
    results = list(executor.map(download, urls))

この例では、`requests`ライブラリを用いて非同期で複数のURLからデータをダウンロードしています。

応用例2:並列な数値計算

スレッドプールはCPUバウンドな処理にも適用できます。以下は、大量の数値計算を並列に行う例です。

from concurrent.futures import ThreadPoolExecutor
import numpy as np

def heavy_computation(data):
    return np.sum(data ** 2)

# データ生成
data_sets = [np.random.randn(1000000) for _ in range(10)]

# スレッドプールを作成
with ThreadPoolExecutor() as executor:
    results = list(executor.map(heavy_computation, data_sets))

この例では、`numpy`ライブラリを用いて大量の数値計算を並列に実行しています。

まとめ

Pythonでスレッドプールを効果的に使用する方法には多くの側面があります。この記事では基本的な使用方法から応用例までを網羅的に解説しました。スレッドプールを活用することで、プログラムのパフォーマンスを向上させることが可能です。

コメント

コメントする

目次