python的os module中有fork()函數用於生成子進程,生成的子進程是父進程的鏡像,但是它們有各自的地址空間,子進程複製一份父進程內存給自己,兩個進程之間的執行是相互獨立的,其執行順序可以是不確定的、隨機的、不可預測的,這點與多執行緒的執行順序相似。
import os def child(): print 'A new child:', os.getpid() print 'Parent id is:', os.getppid() os._exit(0) def parent(): while True: newpid=os.fork() print newpid if newpid==0: child() else: pids=(os.getpid(),newpid) print "parent:%d,child:%d"%pids print "parent parent:",os.getppid() if raw_input()=='q': break parent()
在我們載入了os模組之後,我們parent函數中fork()函數產生了一個子進程,回傳值newpid有兩個,一個為0,用表示子進程,一個是大於0的整數,用以表示父進程,這個常數正是子進程的pid. 透過print語句我們可以清楚看到兩個回傳值。如果fork()回傳值是負值,表示子程序產生不成功(這個簡單程式中沒有考慮這種情況)。如果 newpid==0,則表示我們進入了子進程,也就是child()函數中,在子進程中我們輸出了自己的id和父進程的id。如果進入了else語句,則表示newpid>0,我們進入到父進程中,在父進程中os.getpid()得到自己的id,fork()回傳值newpid表示了子進程的id,同時我們輸出了父行程的父行程的id. 透過實驗我們可以看到if和else語句的執行順序是不確定的,子、父行程的執行順序由作業系統的調度演算法來決定。