Python3 Multiprocessing os.fork 在同一个资源上运行?


import os
a=[]
pid=os.fork()
if(pid!=0):
a.append(1)
print("Original: ", end='')
print(a,id(a))
else:
a.append(2)
print("Child: ", end='')
print(a,id(a))
# Result:
# Original: [1] 139725666412296
# Child: [2] 139725666412296

1. 为什么父进程和子进程共享相同的资源 ID?
2.如果它们共享相同的id,在我将2附加到列表中之后,为什么子进程没有打印出2?

3. 然后,在执行上述代码块后,我打印出(在新的Jupyter笔记本代码块中(lst现在包含的内容。它打印:[1]。如果父进程先执行,子进程最后执行,为什么 lst 不是 [1,2]?

[部分回答:我回答你的问题1和2,但不回答3。

fork可以被认为是生成一个进程,该进程从父进程内存的副本开始,但随后可以分别修改两者,以便内容在初始副本之后可以发散。 事实上,为了提高效率,它是作为写入时复制实现的,因此只有在内存页实际被修改时才发生任何复制,但这一事实不应影响它是副本的概念

这意味着,为了回答您的问题 1 和 2,对象的 ID 是相同的,因为它是在分叉之前创建的,但在分叉之后完成的赋值在其他进程中将不可见。 在任何情况下,您都无法控制父进程和子进程中的执行时间(但即使时间变化,每个结果都不会受到影响,只会影响它们的整理顺序(。

最新更新