簡單分析Python中用fork()函數(shù)生成的子進程
python的os module中有fork()函數(shù)用于生成子進程,生成的子進程是父進程的鏡像,但是它們有各自的地址空間,子進程復制一份父進程內(nèi)存給自己,兩個進程之 間的執(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函數(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使用?TCP協(xié)議實現(xiàn)智能聊天機器人功能
TCP協(xié)議適用于對效率要求相對較低而準確性要求很高的場合,下面通過本文給大家介紹基于Python?使用?TCP?實現(xiàn)智能聊天機器人,需要的朋友可以參考下2022-05-05python 字典 setdefault()和get()方法比較詳解
這篇文章主要介紹了python 字典 setdefault()和get()方法比較詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08Tornado協(xié)程在python2.7如何返回值(實現(xiàn)方法)
下面小編就為大家?guī)硪黄猅ornado協(xié)程在python2.7如何返回值(實現(xiàn)方法)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06python使用matplotlib畫出的圖怎樣放到word中
這篇文章主要介紹了python使用matplotlib畫出的圖怎樣放到word中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09基于logstash實現(xiàn)日志文件同步elasticsearch
這篇文章主要介紹了基于logstash實現(xiàn)日志文件同步elasticsearch,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08VSCODE配置Markdown及Markdown基礎(chǔ)語法詳解
這篇文章主要介紹了VSCODE配置Markdown及Markdown基礎(chǔ)語法詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01django開發(fā)之settings.py中變量的全局引用詳解
當網(wǎng)站里面的一些內(nèi)容,如郵箱,網(wǎng)站標題,網(wǎng)站的描述,這些東西我們可以存在數(shù)據(jù)庫中也可以存放在我們的setting 文件中,這篇文章主要給大家介紹了django中settings.py變量的全局引用的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考下。2017-03-03