我正在学习python中的多处理。我尝试了多处理,在阅读了多处理模块的源代码之后,我发现它使用了os.fork(),因此我写了一些代码来测试os.fork(),但是我被卡住了。我的代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import time

for i in range(2):
    print '**********%d***********' % i
    pid = os.fork()
    print "Pid %d" % pid

我认为每次打印将执行两次,但它们将执行三次。我不明白这是怎么回事?
我读了这个Need to know how fork works?
根据本文的说法,它也会被执行两次,所以我很困惑……

最佳答案

为了直接回答问题,os.fork()通过调用底层OS函数fork()来工作。

但是您肯定对它的作用感兴趣。好吧,这创建了另一个过程,该过程将在与此完全相同的地方恢复。因此,在第一个循环运行中,您将获得一个fork,之后有两个进程,“原始进程”(获得子进程的PID的pid值)和 fork 的进程(获得pid0值) 。

他们都打印其pid值,并继续进行第二次循环运行,并同时打印它们。然后它们都 fork ,剩下4个进程,它们全部打印各自的pid值。其中两个应为0,其他两个应为其刚刚创建的子代的PID。

将代码更改为

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import time

for i in range(2):
    print '**********%d***********' % i
    pid = os.fork()
    if pid == 0:
        # We are in the child process.
        print "%d (child) just was created by %d." % (os.getpid(), os.getppid())
    else:
        # We are in the parent process.
        print "%d (parent) just created %d." % (os.getpid(), pid)

您会更好地看到会发生什么:每个进程都会告诉您自己的PID和在派生上发生了什么。

10-08 08:09
查看更多