python的os module中有fork()函數(shù)用于生成子進(jìn)程,生成的子進(jìn)程是父進(jìn)程的鏡像,但是它們有各自的地址空間,子進(jìn)程復(fù)制一份父進(jìn)程內(nèi)存給自己,兩個(gè)進(jìn)程之 間的執(zhí)行是相互獨(dú)立的,其執(zhí)行順序可以是不確定的、隨機(jī)的、不可預(yù)測(cè)的,這點(diǎn)與多線程的執(zhí)行順序相似。
import osdef 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': breakparent()
在我們加載了os模塊之后,我們parent函數(shù)中fork()函數(shù)生成了一個(gè)子進(jìn)程,返回值newpid有兩個(gè),一個(gè)為0,用以表示子進(jìn)程,一個(gè)是大于 0的整數(shù),用以表示父進(jìn)程,這個(gè)常數(shù)正是子進(jìn)程的pid. 通過(guò)print語(yǔ)句我們可以清晰看到兩個(gè)返回值。如果fork()返回值是一個(gè)負(fù)值,則表明子進(jìn)程生成不成功(這個(gè)簡(jiǎn)單程序中沒(méi)有考慮這種情況)。如果 newpid==0,則表明我們進(jìn)入到了子進(jìn)程,也就是child()函數(shù)中,在子進(jìn)程中我們輸出了自己的id和父進(jìn)程的id。如果進(jìn)入了else語(yǔ)句, 則表明newpid>0,我們進(jìn)入到父進(jìn)程中,在父進(jìn)程中os.getpid()得到自己的id,fork()返回值newpid表示了子進(jìn)程的id,同時(shí)我們輸出了父進(jìn)程的父進(jìn)程的id. 通過(guò)實(shí)驗(yàn)我們可以看到if和else語(yǔ)句的執(zhí)行順序是不確定的,子、父進(jìn)程的執(zhí)行順序由操作系統(tǒng)的調(diào)度算法來(lái)決定。
新聞熱點(diǎn)
疑難解答
圖片精選