ケの日常

備忘録代わりのブログ

Pythonでmultiprocessingを触ってみる

業務でPythonを使用してProcess管理みたいなことしたい機会があったので、
とりあえず公式ドキュメントを参考に動かしてみた。

docs.python.org

とりあえずProcessを使ってみる。

from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    for i in range(0, 4):
        p = Process(target=f, args=('Yamada' + str(i),))
        p.start()
        p.join()

出力結果は以下の通り。

hello Yamada0
hello Yamada1
hello Yamada2
hello Yamada3

Start()メソッドはProcessを開始させるとして、
Join()メソッドはJoinメソッドを呼んだプロセスが終了するまで待機するらしい。

  • Joinメソッドを実行しない場合
from multiprocessing import Process
import time

def f(name, i):
    print('start:', i)
    time.sleep(i)
    print('hello ', name)
    print('end:', i)

if __name__ == '__main__':
    for i in range(1, 5):
        p = Process(target=f, args=('Yamada ' + str(i),i,))
        p.start()
  • 実行結果
start: 1
start: 2
start: 3
start: 4
hello  Yamada 4
end: 4
hello  Yamada 3
end: 3
hello  Yamada 2
end: 2
hello  Yamada 1
end: 1
  • Joinメソッドを実行した場合
from multiprocessing import Process
import time

def f(name, i):
    print('start:', i)
    time.sleep(i)
    print('hello ', name)
    print('end:', i)

if __name__ == '__main__':
    for i in range(1, 5):
        p = Process(target=f, args=('Yamada ' + str(i),i,))
        p.start()
        p.join() 
  • 実行結果
start: 1
hello  Yamada 1
end: 1
start: 2
hello  Yamada 2
end: 2
start: 3
hello  Yamada 3
end: 3
start: 4
hello  Yamada 4
end: 4

Join()メソッドを実行するとプロセスの実行が終了するまで次の処理を待機してくれている。 似たようなことC#でもやってたのに忘れてるな・・・。