多くのプロセスから、ピック可能な大型のPythonオブジェクトのセットにアクセスする必要があります。したがって、これらのオブジェクトが完全にコピーされないようにしたいと思います。LinuxシステムでのPythonマルチプロセッシングでフォークの動作を確認する
thisとthisのコメントによると、オブジェクトは変更されない限り、(UNIXシステムでは)コピーされません。ただし、オブジェクトを参照すると参照カウントが変更され、参照カウントがコピーされます。
これまでのところ正しいですか?私の関心は私の大きなオブジェクトのサイズに起因するので、これらのオブジェクトの小さな部分がコピーされても問題はありません。 f
の最初の行で
from multiprocessing import Pool
def f(arg):
print(l, id(l), object.__repr__(l))
l[arg] = -1
print(l, id(l), object.__repr__(l))
def test(n):
global l
l = list(range(n))
with Pool() as pool:
pool.map(f, range(n))
print(l, id(l), object.__repr__(l))
if __name__ == '__main__':
test(5)
、私はすべての機能に同じ番号を返すようにid(l)
を期待:
id
チェックの前に変更されていないためです。
一方、f
の3行目では、リストが2行目で変更されるため、id(l)
は各メソッド呼び出しで異なる番号を返す必要があります。
しかし、プログラムの出力が私を困惑させる。
[0, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[-1, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, -1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, -1, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, -1, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, 3, -1] 139778408436488 <list object at 0x7f20b261d308>
[0, 1, 2, 3, 4] 139778408436488
idはすべてf
のすべてのコールと回線で同じです。これは、リストが最後に変更されていなくても(期待通り)、リストにはがコピーされていることを意味します。
オブジェクトがコピーされているかどうかを確認する方法はありますか?
オブジェクトが作成されると、そのオブジェクトのIDは変更できません。 –
@RossRidge:オブジェクトをコピーするとき、元のものとは異なる場所にあるはずですか?このメモリアドレスを取得する方法はありますか( 'id'が何かを返すかどうか)? – Samufi
ありがとう、@ジョナサンユーニス。私は声明を訂正しようとしました。それは今大丈夫ですか? – Samufi