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を使って並列化する場合には少し注意しないといけない。