我正在学习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 的进程(获得pid
的0
值) 。
他们都打印其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和在派生上发生了什么。