【问题标题】:Python3 Multiprocessing os.fork operates on the same resource?Python3 Multiprocessing os.fork 在同一资源上运行?
【发布时间】:2020-05-30 06:17:11
【问题描述】:
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]?

【问题讨论】:

  • ID 独特性保证仅适用于单个进程。不同进程中的相同 ID 没有任何意义。

标签: python multithreading operating-system multiprocessing ram


【解决方案1】:

[部分回答:我解决了您的问题 1 和 2,但不是 3。]

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

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

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多