有人可以向我解释以下os.fork()示例吗?

Alw*_*ver 10 python parallel-processing

[代码取自Mark Lutz编程Python第4版]

"forks child processes until you type 'q'"
import os
def child():
    print('Hello from child', os.getpid())
    os._exit(0) # else goes back to parent loop

def parent():
    while True:
        newpid = os.fork()
        if newpid == 0:
            child()
        else:
            print('Hello from parent', os.getpid(), newpid)
        if input() == 'q': break

parent()
Run Code Online (Sandbox Code Playgroud)

运行时代码输出的内容:

Hello from parent 2057 2062 
Hello from child 2062

Hello from parent 2057 2068 
Hello from child 2068

Hello from parent 2057 2069 
Hello from child 2069

Hello from parent 2057 2070 
Hello from child 2070 
q
Run Code Online (Sandbox Code Playgroud)

我理解的事情:

  1. os.fork() 用于与当前进程并行启动另一个进程.
  2. os.fork() 创建上一个Python会话的副本并并行打开它.
  3. os.fork() 返回新进程的id.

我不明白的事情:

  1. 为什么os.getpid()代码运行时永远不会改变它的值?
  2. 为什么要child()调用这个函数?假设newpid!= 0 的值,那么程序将打印出来print('Hello from parent', os.getpid(), newpid).但是,在那之后,它会打印来自child的行而不是请求输入,因为case在if语句之后.
  3. os._exit(0)做什么?

非常感谢你的时间.:)

Mar*_*cny 6

1:为什么代码运行时os.getpid()的值永远不会改变?

os.getpid()父项的值永远不会改变,因为它始终是相同的过程.由于fork()始终使用自己的PID创建一个全新的子进程克隆,因此pid将每次为子进行更改.

2:为什么调用child()函数?假设newpid!= 0的值,那么程序将打印出print('Hello from parent',os.getpid(),newpid).但是,在那之后,它会打印来自child的行而不是请求输入,因为case在if语句之后.

调用子进程是因为现在有两个进程在运行.一个称为child()函数,另一个称为print函数.他们只是打算在屏幕上打印,你在这种情况下首先看到父打印"胜利".

3:os._exit(0)在做什么?

请参见:https://docs.python.org/2/library/os.html#os._exit

退出状态为n的进程,不调用清理处理程序,刷新stdio缓冲区等.

  • `newpid = os.fork()`在此行之前有一个进程.在这一行之后有两个完全相同的进程除外:对于子进程,`newpid`将为0,而`newpid`将是父进程中子进程的pid.在"父亲问候"之后看到的永不改变的值是父ID.之后的值是孩子的PID(而且正在改变) (2认同)