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

