gpt4 book ai didi

python - python中fork()创建的进程会做什么?

转载 作者:行者123 更新时间:2023-12-01 04:20:54 25 4
gpt4 key购买 nike

我编写了以下代码,但我不明白它是如何工作的:

NUM=8
def timec():
x=1000000
while x>0:
x-=1
pid_children=[]
start_time=time.time()
for i in range(NUM):
pid=os.fork()
if pid==0:
timec()
os._exit(0)
else:
pid_children.append(pid)

for j in pid_children:
os.waitpid(j,0)
print(time.time()-start_time)

我无法理解子进程从哪里开始或在哪里结束。

另一个问题是 waitpid() 方法会等待子进程完成其工作,还是会在调用后立即返回?

最佳答案

os.fork()被调用时,程序 split 成两个完全独立的程序。在子进程中,os.fork() 返回 0。在父进程中,os.fork() 返回子进程的进程 ID。

os.fork() 的关键区别在于,它不会创建共享原始线程内存的新线程,而是创建一个全新的线程。过程。 新进程拥有其父进程的内存副本。父进程中的更新不会反射(reflect)在子进程中,子进程中的更新也不会反射(reflect)在父进程中!每个都有自己的状态。

鉴于上述背景,以下是您的具体问题的答案:

子进程从哪里开始?

pid = os.fork()

这将生成超过 NUM 个进程,因为在第一次迭代之后,for 循环内将有 2 个进程,每个进程将 fork 为 2 个进程,在第二次迭代后总共产生 4 个进程。 总共将创建 256 (2^8) 个进程!

子进程在哪里结束?

有些将退出于:

os._exit(0)

其他的将在文件末尾退出。这是因为您在循环的后续迭代中覆盖了 pid,因此一些子进程成为孤儿(并且从未运行 timec())。

pid_children 中始终只有一个进程。这是因为程序的整个状态都是 fork 的,并且每个 fork (有自己的列表副本)仅向列表添加一个元素。

waitpid 做什么?

os.waitpid(pid) 将阻塞,直到 pid pid 的进程完成。

os.fork() documentation

os.waitpid() documentation

关于python - python中fork()创建的进程会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com