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