Pythonでスレッド プールを構築しタスクをプールに送信し実行する

スポンサーリンク

Pythonでスレッド プールを構築しタスクをプールに送信しpool.map()を用いて実行してみます。

この記事は「multiprocessing.pool.ThreadPoolを用いてスレッドプールを構成する」という記事の続きです。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■スレッド プールを構築しタスクをプールに送信し実行する

では、早速スレッド プールを構築しタスクをプールに送信し実行するスクリプトを書いていきます。

■コード

import time
import multiprocessing.pool

def square(x):
    print(f"プロセスの開始 {x}")
    square = x * x
    time.sleep(1)
    print(f"プロセスの終了 {x}")
    return square

if __name__ == "__main__":
    pool_test = multiprocessing.pool.ThreadPool()
    a = pool_test.map(square, range(0, 5))
    print(a)

今回はimportでPythonの標準ライブラリであるtimeとmultiprocessing.poolを呼び出します。その後、タスクを作ります。今回はsquareという関数をdef文を用いて定義します。関数の括弧内には引数,パラメータとしてxを設定します。この関数が呼び出されたときに実行される処理としては、引数,パラメータとして受け取った値同士を”*(アスタリスク)”を用いて乗算(掛け算)し、結果をsquare変数に格納します。格納後、time.sleep()関数を用いてプログラムを停止します。今回は引数,パラメータとして「1」を渡し、1秒間だけプログラムを停止させます。その後、returnとして、square変数を返すという処理になります。

タスクを作った後は、スレッドプールを構成するためには、pool_testという変数を定義し、その中で、multiprocessing.pool.ThreadPool()を用います。これで、ThreadPool クラスを用いて、インスタンスが作成されました。インスタンスが作成されたことで、スレッドプールの構成が完了となります。完了後、aという変数を定義し、その中でpool_test変数に対してmap()を用います。括弧内には、第1の引数,パラメータとしてsquare変数を渡します。次に第2の引数,パラメータとしてイテラブル(繰り返し可能なオブジェクト)を渡します。今回はrange()を用いて、0から5までの連続した数値を要素として持つオブジェクトを渡します。これで渡したオブジェクトをチャンク(データの塊)に分割し、個別のタスクとしてスレッド プールに送信します。

プールに送信後、タスクを実行します。実行後、処理されたタスクがa変数に格納されますので、格納されたa変数をprint()で出力させます。

■実行・検証

このスクリプトを「task_p.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、構成したスレッドプールにタスクである定義した関数が送信され、送信後タスクが実行。実行後、タスクの結果が出力されていることを確認できました。

コメント

タイトルとURLをコピーしました