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。