紙媒体で管理するとなくなりがちなのでブログで進捗などを管理することにしました
※殆どの記事は自分自身のためだけにかいています.他人に見せられるレベルには至っていません...

【並行処理】【Python】プロセスについて

Processクラス
multiprocessingクラスでのプロセスの手順

  1. Processのオブジェクトを作成
  2. start()メソッドの呼び出し
  3. 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
上のコードについて実行されたプロセスのIDを表示するために拡張したコード

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

mainでの現プロセスと関数fでの親プロセスが一致することに注意

コンテキストと開始方式

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()関数はコネクションオブジェクトのペアを返す.
デフォルトでは双方向性パイプを返す.