【並行処理】【Python】プロセスについて
Processクラス
multiprocessingクラスでのプロセスの手順
- Processのオブジェクトを作成
- start()メソッドの呼び出し
- join()で処理が完全に終わるまで待つ
Process()クラスの呼び出しで引数はtargetに実行したい関数名,argsにtargetに入れる引数を入れる.一つとは限らないので最後に,をつける.
from multiprocessing import Process def f(name): print("hello",name) if __name__ == '__main__': p = Process(target=f,args=('bob',)) p.start() p.join()
hello bob
from multiprocessing import Process import os def info(title): print(title) print('module name:',__name__) print('parent process:',os.getppid()) print('process id:',os.getpid()) def f(name): info('function f') print('hello',name) if __name__ == '__main__': info('main line') print("-"*20) p = Process(target=f,args=('bob',)) p.start() p.join()
os.getppid()は親プロセスのID,os.getpid()は現在のプロセスのIDを取得する.
main line
module name: __main__
parent process: 13055
process id: 18154
function f
module name: __main__
parent process: 18154
process id: 18155
hello bob
コンテキストと開始方式
import multiprocessing as mp def foo(q): q.put("hello") if __name__ == "__main__": mp.set_start_method("spawn") q = mp.Queue() p = mp.Process(target=foo,args=(q,)) p.start() print(q.get()) p.join()
hello
プロセス間でのオブジェクト交換
キュー
Queueクラスはqueue.Queueクラスとほぼ同じ使い方ができる.
from multiprocessing import Process,Queue def f(q): q.put([42,None,"hello"]) if __name__ == "__main__": q = Queue() p = Process(target=f,args=(q,)) p.start() print(q.get()) p.join()
[42,None,'hello']
パイプ
Pipe()関数はコネクションオブジェクトのペアを返す.
デフォルトでは双方向性パイプを返す.