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。