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

 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
bbb
after
我的pid 0
bbb

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

也就是同时执行

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
2
son
3

  

 

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

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

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

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

posted @ 2020-04-14 17:24  运维时代  阅读(3393)  评论(0编辑  收藏  举报