關(guān)于對(duì)python中進(jìn)程的幾個(gè)概念理解
進(jìn)程
第一,進(jìn)程是一個(gè)容器。每一個(gè)進(jìn)程都有它自己的地址空間,一般情況下,包括文本區(qū)域( text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。
文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)城存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲(chǔ)看活動(dòng)過(guò)程調(diào)用的指令和本地變量。
第二,進(jìn)程是一個(gè)"執(zhí)行中的程序"。程序是一個(gè)沒(méi)有生命的實(shí)體,只有處理器賦予程序生命時(shí)(操作系統(tǒng)執(zhí)行之),它才 能成為一個(gè)活動(dòng)的實(shí)體,我們稱(chēng)其為進(jìn)程。
第三,進(jìn)程是操作系統(tǒng)中最基本、重要的概念。是多道程序系統(tǒng)岀現(xiàn)后,為了刻圓系統(tǒng)內(nèi)部出現(xiàn)的 動(dòng)態(tài)情況,箍述系統(tǒng)內(nèi)部眢道程序的活動(dòng)規(guī)律引進(jìn)的一個(gè)概念,所有多道程序設(shè)計(jì)搡作系統(tǒng)都建立在進(jìn)程的基礎(chǔ)上。
本文為了說(shuō)明例子,用中文作為變量寫(xiě)在了程序里面,一般編程最好不要那么寫(xiě)
僵尸進(jìn)程
僵尸進(jìn)程是當(dāng)子進(jìn)程比父進(jìn)程先結(jié)束,而父進(jìn)程又沒(méi)有回收子進(jìn)程,釋放子進(jìn)程占用的資源,此時(shí)子進(jìn)程將成為一個(gè)僵尸進(jìn)程。如果父進(jìn)程先退出 ,子進(jìn)程被init接管,子進(jìn)程退出后init會(huì)回收其占用的相關(guān)資源
我們都知道進(jìn)程的工作原理。我們啟動(dòng)一個(gè)程序,開(kāi)始我們的任務(wù),然后等任務(wù)結(jié)束了,我們就停止這個(gè)進(jìn)程。 進(jìn)程停止后, 該進(jìn)程就會(huì)從進(jìn)程表中移除。
你可以通過(guò) System-Monitor 查看當(dāng)前進(jìn)程。
In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系統(tǒng)中,一個(gè)進(jìn)程結(jié)束了,但是他的父進(jìn)程沒(méi)有等待(調(diào)用wait / waitpid)他, 那么他將變成一個(gè)僵尸進(jìn)程。 但是如果該進(jìn)程的父進(jìn)程已經(jīng)先結(jié)束了,那么該進(jìn)程就不會(huì)變成僵尸進(jìn)程, 因?yàn)槊總€(gè)進(jìn)程結(jié)束的時(shí)候,系統(tǒng)都會(huì)掃描當(dāng)前系統(tǒng)中所運(yùn)行的所有進(jìn)程, 看有沒(méi)有哪個(gè)進(jìn)程是剛剛結(jié)束的這個(gè)進(jìn)程的子進(jìn)程,如果是的話,就由Init 來(lái)接管他,成為他的父進(jìn)程
孤兒進(jìn)程
在操作系統(tǒng)領(lǐng)域中,孤兒進(jìn)程指的是在其父進(jìn)程執(zhí)行完成或被終止后仍繼續(xù)運(yùn)行的一類(lèi)進(jìn)程。這些孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。
代碼示例
from multiprocessing import Process import time def 要運(yùn)行的函數(shù)(): print('我是子進(jìn)程A') time.sleep(5) print('我是子進(jìn)程B') if __name__ == '__main__': p = Process(target=要運(yùn)行的函數(shù)) p.start() print('我是主進(jìn)程')
效果
守護(hù)進(jìn)程
守護(hù)進(jìn)程是一個(gè)在后臺(tái)運(yùn)行并且不受任何終端控制的進(jìn)程。Unix操作系統(tǒng)有很多典型的守護(hù)進(jìn)程(其數(shù)目根據(jù)需要或20—50不等),它們?cè)诤笈_(tái)運(yùn)行,執(zhí)行不同的管理任務(wù)。
用戶使守護(hù)進(jìn)程獨(dú)立于所有終端是因?yàn)椋谑刈o(hù)進(jìn)程從一個(gè)終端啟動(dòng)的情況下,這同一個(gè)終端可能被其他的用戶使用。例如,用戶從一個(gè)終端啟動(dòng)守護(hù)進(jìn)程后退出,然后另外一個(gè)人也登錄到這個(gè)終端。用戶不希望后者在使用該終端的過(guò)程中,接收到守護(hù)進(jìn)程的任何錯(cuò)誤信息。同樣,由終端鍵入的任何信號(hào)(例如中斷信號(hào))也不應(yīng)該影響先前在該終端啟動(dòng)的任何守護(hù)進(jìn)程的運(yùn)行。雖然讓服務(wù)器后臺(tái)運(yùn)行很容易(只要shell命令行以&結(jié)尾即可),但用戶還應(yīng)該做些工作,讓程序本身能夠自動(dòng)進(jìn)入后臺(tái),且不依賴(lài)于任何終端。
守護(hù)進(jìn)程沒(méi)有控制終端,因此當(dāng)某些情況發(fā)生時(shí),不管是一般的報(bào)告性信息,還是需由管理員處理的緊急信息,都需要以某種方式輸出。Syslog 函數(shù)就是輸出這些信息的標(biāo)準(zhǔn)方法,它把信息發(fā)送給 syslogd 守護(hù)進(jìn)程。
代碼實(shí)現(xiàn)
from multiprocessing import Process import time def 要運(yùn)行的函數(shù)(變量): print('%s負(fù)責(zé)剝削的資本家正在運(yùn)行'% 變量) time.sleep(3) print('%s負(fù)責(zé)剝削的資本家正在終止' % 變量) if __name__ == '__main__': A = Process(target=要運(yùn)行的函數(shù),args=('資本家',)) A.daemon = True # 將進(jìn)程A設(shè)置成守護(hù)進(jìn)程 本行代碼要放在start方法上面才有效,否則會(huì)報(bào)錯(cuò) A.start() print('剝削的資本家被終止了')
效果
互斥鎖
在編程中,引入了對(duì)象互斥鎖的概念,來(lái)保證共享數(shù)據(jù)操作的完整性。每個(gè)對(duì)象都對(duì)應(yīng)于一個(gè)可稱(chēng)為" 互斥鎖" 的標(biāo)記,這個(gè)標(biāo)記用來(lái)保證在任一時(shí)刻,只能有一個(gè)線程訪問(wèn)該對(duì)象。
比如,一群人中,出現(xiàn)了一個(gè)工賊,但是,人們覺(jué)得用拳頭不爽,但是狼牙棒只有一個(gè),于是大家要開(kāi)始搶狼牙棒,我們就對(duì)狼牙棒上一個(gè)互斥鎖
代碼實(shí)現(xiàn)
from multiprocessing import Process, Lock import json import time import random # 查狼牙棒 def search(i): # 文件操作讀取狼牙棒數(shù) with open('data','r',encoding='utf8') as f: dic = json.load(f) print('群眾%s想要獲取余狼牙棒:%s'%(i, dic.get('狼牙棒_num'))) # 字典取值不能用[]的形式 應(yīng)該使用get,即使函數(shù)不能運(yùn)行也要寫(xiě)個(gè)pass上去,這是為了避免因?yàn)樾?wèn)題導(dǎo)致整個(gè)程序無(wú)法運(yùn)行的情況 # 搶狼牙棒 1.先查 2.再搶 def buy(i): # 先查狼牙棒 with open('data.txt','r',encoding='utf8') as f: dic = json.load(f) # 模擬網(wǎng)絡(luò)延遲 time.sleep(random.randint(1,5))#每個(gè)人的手速不同 # 判斷當(dāng)前是否有狼牙棒 if dic.get('狼牙棒_num') > 0: # 修改數(shù)據(jù)庫(kù) 搶狼牙棒 dic['狼牙棒_num'] -= 1 # 寫(xiě)入數(shù)據(jù)庫(kù) with open('data.txt','w',encoding='utf8') as f: json.dump(dic,f) print('群眾%s搶狼牙棒成功'%i) else: print('群眾%s搶狼牙棒失敗'%i) # 整合上面兩個(gè)函數(shù) def run(i, mutex): search(i) # 給狼牙棒環(huán)節(jié)加鎖處理 # 搶鎖 mutex.acquire() buy(i) # 釋放鎖 mutex.release() if __name__ == '__main__': # 在主進(jìn)程中生成一把鎖 讓所有的子進(jìn)程搶 mutex = Lock() for i in range(1,11): p = Process(target=run, args=(i, mutex)) p.start()
效果
文件格式
總結(jié)
到此這篇關(guān)于對(duì)python中進(jìn)程的幾個(gè)概念理解的文章就介紹到這了,更多相關(guān)python進(jìn)程概念理解內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。