コンテンツにスキップ

Pythonで簡単に「並列処理」を行う

参考:Pythonにおける並行・並列処理について調べてみた - okigaki_log

参考: 並行処理と並列処理|Goでの並行処理を徹底解剖!

マルチプロセス化は,multiprocessingモジュール(標準ライブラリ)を使うことで実現できます.しかし,プロセスの制御が難しく初めて学ぶには敷居が高いです.

この記事では,標準ライブラリに含まれる concurrent.features にあるProcessPoolExecutorを利用してマルチプロセス化を実現します.

以下はサンプルプログラムです.

import time
from concurrent.futures import ProcessPoolExecutor, as_completed


def my_sleep(i: int):
    print(f"begin {i}")
    # i秒間の待機
    time.sleep(i)
    print(f"end {i}")
    return f"ok {i}"


def main():
    # max_workersが同時に存在するプロセス数.
    # 未指定の場合は自動でCPUコア数から決定される.
    with ProcessPoolExecutor(max_workers=3) as executor:
        # プロセスの一覧を保持するためのPoolリスト
        process_pool = []
        for i in range(2, 8):
            # 並列で実行したい関数を呼び出す
            # 引数の数が増えた場合はiのうしろにつなげていく
            my_process = executor.submit(my_sleep, i)
            # Poolへ発行したプロセスを追加
            process_pool.append(my_process)

        # 処理を終えたプロセスから結果を出力していく.
        for p in as_completed(process_pool):
            print(p.result())


if __name__ == "__main__":
    main()

以下は実行例です.

$ python a.py
begin 2
begin 3
begin 4
end 2
begin 5
ok 2
end 3
begin 6
ok 3
end 4
begin 7
ok 4
end 5
ok 5
end 6
ok 6
end 7
ok 7

参考資料: