Python3でプロセスを立ち上げて、マルチスレッドで処理する方法です!
import
importするのはコチラ。
from multiprocessing import Process
プロセス作成
このようにするとプロセスを作成することができます。
p1 = Process(target=print, args=(1, 2, 3), kwargs={'sep': '-'})
Processの引数は
項目 | 用途 |
---|---|
target | プロセスにする関数 |
args | 引数 |
kwargs | 引数 |
第1引数 argsの注意点
引数(少なくともargs)は、引数が1つの場合は注意が必要そう。
あくまでタプルで渡すようにできているため
def func(arg): print(str(arg)) p = Process(target=func, args=(1))
のようにするとエラーになる。
この場合、下記のようにカンマをつけ、タプル扱いにする必要がある。
def func(arg): print(str(arg)) p = Process(target=func, args=(1,))
プロセスを操作する関数
作成したプロセスは、これらを実行する事ができます。
関数 | 内容 |
---|---|
p1.start() | プロセスの開始 |
p1.terminate() | プロセスの中断 |
p1.join() | 処理のブロック |
見ている限りjoin()をすると動き出すのですが、「処理のブロック」というのがよくわからない……
サンプル
サンプルソースと実行結果についてです。
ソース
サンプルソースです。
from multiprocessing import Process import time def runProcess(num, t): f = t * 0.1 for i in range(5): time.sleep(f) print('im process' + str(num) + " : " + str(i)) if __name__ == '__main__': print('*** create instanse') process1 = Process(target=runProcess, args=(1, 5)) process2 = Process(target=runProcess, args=(2, 7)) process3 = Process(target=runProcess, args=(3, 9)) print('*** start process') process1.start() process2.start() process3.start() print('*** proces join') process1.join() process2.join() process3.join() print("process ended")
runProcess()を作成し、同じ関数で3プロセス生成して実行しています。
それぞれ
- 0.5 ms周期
- 0.7 ms周期
- 0.9 ms周期
で動作します。
結果
サンプルの実行結果です。
*** create instanse *** start process *** proces join im process1 : 0 im process2 : 0 im process3 : 0 im process1 : 1 im process2 : 1 im process1 : 2 im process3 : 1 im process1 : 3 im process2 : 2 im process1 : 4 im process3 : 2 im process2 : 3 im process2 : 4 im process3 : 3 im process3 : 4 process ended
各プロセスが並行して実行されていることがわかります。
第2引数の時間を変更すれば、タイミングが変わるので出力も変化します。
参考
コチラを参考にしました。ありがとうございました。
あとがき
Python3でマルチスレッド処理をする簡単なサンプルでした!
引数が微妙にクセありなものの、簡単にマルチスレッド化することができました。
是非試してみてください!