fork() 创建的进程将在 python 中做什么?

what will process created by fork() do in python?

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

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() 方法会等待子进程完成它的工作,还是会在调用后立即 return?

当调用os.fork()时,程序分裂成两个完全独立的程序。在child, os.fork() returns 0. 在parent, os.fork() returns child的进程id.

keyos.fork()的区别在于,它不会创建一个共享原始线程内存的新线程,而是创建一个全新的进程。 新进程有其 parent 的内存副本。 parent 中的更新不会反映在 child 中,[= =65=]没有体现在parent!每个人都有自己的 状态。

鉴于这种情况,以下是您具体问题的答案:

child 进程从哪里开始?

pid = os.fork()

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

child 进程在哪里结束?

部分退出时间:

os._exit(0)

其他的会在文件末尾退出。那是因为你在循环的后续迭代中覆盖了 pid,所以一些 children 成为孤儿(并且永远不会 运行 timec())。

pid_children 将始终只有一个进程。那是因为程序的整个状态是分叉的,每个分叉(都有自己的列表副本)只向列表添加一个元素。

waitpid是做什么的?

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

os.fork() documentation

os.waitpid() documentation