【发布时间】:2015-05-17 09:26:20
【问题描述】:
我写了一些代码如下,我想通过这些代码来测试多处理的一些具体问题:
import multiprocessing as mp
import sys
z = 10
file = open("test_file")
file2 = open("test_multiprocess", "w")
arr = []
def func(obj, idx):
print("pid[%d] [%s]" % (idx,str(id(obj))))
if idx == 1:
obj += 3
elif idx == 2:
obj = open("test_multiprocess")
elif idx == 3:
obj = open("test_multiprocess_%d" % idx, "w")
elif idx == 4:
obj.append(idx)
print("pid[%d] after changing [%s]" % (idx, str(id(obj))))
sys.stdout.flush()
if __name__ == "__main__":
data = {1:z, 2:file, 3:file2, 4:arr}
p = []
print("original id is [%s] [%s] [%s] [%s]" % (str(id(data[1])), str(id(data[2])), str(id(data[3])), str(id(data[4]))))
print("==============================================================")
for i in range(1, 5):
p.append(mp.Process(target=func, args=(data[i], i)))
p[len(p)-1].start()
for i in range(i, len(p)):
p[i].join()
sys.stdout.flush()
print("==============================================================")
print("after process id is [%s] [%s] [%s] [%s]" % (str(id(data[1])), str(id(data[2])), str(id(data[3])), str(id(data[4]))))
但是,当我运行这个文件时,我发现了一些奇怪的现象。一个特定的输出如下:
original id is [6330144] [140069930330512] [140069930330992] [140069873535384]
==============================================================
pid[1] [6330144]
pid[1] after changing [6330072]
pid[2] [140069930330512]
pid[2] after changing [140069864561880]
pid[3] [140069930330992]
pid[3] after changing [140069864561880]
==============================================================
after process id is [6330144] [140069930330512] [140069930330992] [140069873535384]
pid[4] [140069873535384]
pid[4] after changing [140069873535384]
首先,当将 data[i] 传递给子进程时, id(data[i]) 根本没有改变,但是 AFAIK python fork() 由于引用计数的变化而正在复制访问。其次,假设它在python中是copy-on-write,当obj在子进程中被修改时,int/File类型对象确实改变了它的id,但是对于类型list来说这是不正确的,因为我们可以看到它的id即使与原始相比也不会改变ID。最后但并非最不重要的一点是,我使用 join 等待所有子进程完成,但父进程的输出似乎总是与子进程混淆,为什么?谢谢谁能帮我解释一下。
【问题讨论】:
标签: python multiprocessing shared-memory python-multiprocessing