Yura YuLife

ITエンジニアの覚え書き。

Pythonでマルチプロセス処理

例えば、ファイルを1行ずつ読んでその1行1行に対して何か重い処理(データベースへ登録、自然言語処理など)をする場合、マルチプロセスで並列処理を行うと早くなることがあります。

以下のようなサンプルプログラムを動かしてみました。

マルチプロセスの処理スクリプト

multi_process.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import time
from multiprocessing import Process


def some_process(idx, num_process, lines):
    for line in lines[idx::num_process]:
        print "プロセス%d: %s行目を処理します" % (idx, line.strip())
        time.sleep(1.0)  # 重い処理風


def main():
    # プロセス数(<プロセッサ数)
    num_process = 4
    # 標準入力を行ごとに区切ったリスト
    lines = sys.stdin.readlines()

    # サブプロセスを生成
    process_list = []
    for idx in range(num_process):
        p = Process(target=some_process, args=(idx, num_process, lines))
        process_list.append(p)
    # プロセスを開始
    for p in process_list:
        p.start()
    # プロセスの終了を待つ
    for p in process_list:
        p.join()

if __name__ == '__main__':
    main()

入力するテキストファイ

file.txt

1
2
3
4
5
6
7
8
9
10

スクリプトを実行

$ cat file.txt |python multi_process.py 
プロセス0: 1行目を処理します
プロセス1: 2行目を処理します
プロセス2: 3行目を処理します
プロセス3: 4行目を処理します
プロセス1: 6行目を処理します
プロセス0: 5行目を処理します
プロセス3: 8行目を処理します
プロセス2: 7行目を処理します
プロセス1: 10行目を処理します
プロセス0: 9行目を処理します

10行しかなかったのでマルチプロセス感がありませんが、4つのプロセスがそれぞれ異なる行を処理しています。

まとめ

例えば、フォルダ内の画像をOpenCVで何かの処理をして出力する、とか、フォルダ内のテキストファイルをMeCab分かち書きして出力する、とか。

そういうスクリプトを組む時にマルチプロセスを使うと、計算時間が短縮できるかなーと。

参考URL