python3启动子进程之 os.fork()

先了解python3 os.fork()  使用说明

在生物学家开始克隆研究之前,计算机科学家就拥有成功的克隆历史。 他们克隆了进程,尽管他们没有将其称为克隆而是fork, fork是Unix和Linux最重要的方面之一。 当进程要fork(克隆)时,它会创建自己的副本, 更一般而言,在多线程(进程)环境中的fock意味着执行的线程(进程)被复制,从而从父线程(进程)创建子线程。 它们是相同的,但可以区分开。 fork操作为子线程(进程)创建一个单独的地址空间。 子进程具有父进程所有内存的精确副本。 父子进程的执行彼此独立。

这个函数很特殊,调用一次,返回两次,因为操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的 PID。我们可以通过判断返回值是不是 0 来判断当前是在父进程还是子进程中执行

  • os.fork() 用于在程序中创建子进程,这个方法在子进程中返回0,在父进程中返回子进程的pid。
  • os.fork()  子进程只执行os.fork() 之后的代码块
  • import os
    print('before')
    pid=os.fork()
    print('after')
    print('我的pid',pid)
    print('bbb')
    before
    after
    我的pid 58000
    after
    我的pid 0
    

     说明:程序执行到fork的时候 操作系统对当前的进程(父进程)复制了一份(子进程)地址空间,然后两个同时执行fork()以后的代码 ,同时将的fork()不同值返回给父子进程各自pid变量,然后在执行之后的代码

    也就是同时执行

    print('after') print('我的pid',pid) print('bbb')

     所以会打印各自的pid 和 两个 after,bbb

    import os
    import time
    print('before')
    os.fork()
    print('pid',os.getpid())
    os.fork()
    print('ppid',os.getppid())

    上面会            主进程---fork--->子进程(独立)

                            |                           |

                          fork                      fork

                            \|/                        \|/

                         子进程                  子进程

    通过pid  判断 子进程和父进程 并执行行相应代码

    依据: os.fork() 用于在程序中创建子进程,这个方法在子进程中返回0,在父进程中返回子进程的pid

    import os
    def  son():
            print('son')
            print(max(2,3))
    def father():
            print('father')
            print(min(2, 3))
    pid=os.fork()
    if pid==0:
            son()
    else:
            father()
    father
    

    到目前为止,我们已经在示例中调用了在同一脚本文件中定义的函数。

    fork通常用于启动独立程序。为此,我们需要exec *()函数。

    他们通过用该程序替换当前进程来执行新程序。他们不会返回调用它们的程序。他们甚至收到与调用程序相同的进程ID。

    exec函数 参考https://www.python-course.eu/forking.php