fc2ブログ

Pythonのthreading.Threadとmultiprocessing.Process

Pythonで並列化をしようとしたときにはthreading.Threadとmultiprocessing.Processの2通りが簡単だと聞いた。スレッドやプロセス並列化の際にあるクラスのインスタンスを渡す機会があったのでメモ。気をつけないと意図しない動作になってしまう。

threading.Threadでは、インスタンスを渡してスレッドを生成すると同じインスタンスを参照してしまう。これはつまり浅いcopyが行われるということ。


このコードを実行すると、以下のようになる。

% python test_thread1.py
0
1
2

同じインスタンスを参照しているので、インスタンス変数の更新は他のスレッドに影響する。

なので、このような用途でthreading.Threadを使う場合にはインスタンスをdeep copyして使わないとダメ。


% python test_thread2.py
0
0
0


multiprocessing.Processの場合には事情が異なる。インスタンスをコピーしないで渡しても他のプロセスには影響しない。これはthreading.Threadでdeep copyして渡すのと同等。multiprocessing.Processは異なるメモリ空間を使用する別プロセスを生成するから、必然的にdeep copyになる。deep copyと呼んでいいのかは謎だが。


% python test_process.py
0
0
0


threading.Threadやmultiprocessing.Processを使って並列化する場合には少し注意しないといけない。

管理者にだけ表示を許可する