簡單分析Python中用fork()函數(shù)生成的子進程
python的os module中有fork()函數(shù)用于生成子進程,生成的子進程是父進程的鏡像,但是它們有各自的地址空間,子進程復(fù)制一份父進程內(nèi)存給自己,兩個進程之 間的執(zhí)行是相互獨立的,其執(zhí)行順序可以是不確定的、隨機的、不可預(yù)測的,這點與多線程的執(zhí)行順序相似。
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函數(shù)中fork()函數(shù)生成了一個子進程,返回值newpid有兩個,一個為0,用以表示子進程,一個是大于 0的整數(shù),用以表示父進程,這個常數(shù)正是子進程的pid. 通過print語句我們可以清晰看到兩個返回值。如果fork()返回值是一個負值,則表明子進程生成不成功(這個簡單程序中沒有考慮這種情況)。如果 newpid==0,則表明我們進入到了子進程,也就是child()函數(shù)中,在子進程中我們輸出了自己的id和父進程的id。如果進入了else語句, 則表明newpid>0,我們進入到父進程中,在父進程中os.getpid()得到自己的id,fork()返回值newpid表示了子進程的id,同時我們輸出了父進程的父進程的id. 通過實驗我們可以看到if和else語句的執(zhí)行順序是不確定的,子、父進程的執(zhí)行順序由操作系統(tǒng)的調(diào)度算法來決定。
相關(guān)文章
通過Python中的http.server搭建文件上傳下載服務(wù)功能
通過本文我們學(xué)習(xí)了如何使用Python的http.server模塊搭建一個基本的HTTP服務(wù)器,并實現(xiàn)文件下載服務(wù),介紹了如何設(shè)置服務(wù)器端口、自定義文件目錄、定制HTTP響應(yīng)頭以及處理GET請求,感興趣的朋友跟隨小編一起看看吧2024-08-08
Python使用execjs執(zhí)行包含中文參數(shù)的JavaScript
爬蟲的開發(fā)過程中,往往需要對JS進行模擬,簡單或者通用的還可以在Python中模擬或者找到對應(yīng)的第三方庫,但是復(fù)雜的就可能不好實現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于Python使用execjs執(zhí)行包含中文參數(shù)的JavaScript的相關(guān)資料,需要的朋友可以參考下2022-03-03
Python使用Scapy實現(xiàn)構(gòu)造特殊數(shù)據(jù)包
Scapy是一款Python庫,可用于構(gòu)建、發(fā)送、接收和解析網(wǎng)絡(luò)數(shù)據(jù)包,這篇文章主要為大家詳細介紹了python如何使用Scapy構(gòu)造特殊數(shù)據(jù)包,有需要的可以參考下2023-11-11

