關(guān)于對python中進程的幾個概念理解
進程
第一,進程是一個容器。每一個進程都有它自己的地址空間,一般情況下,包括文本區(qū)域( text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。
文本區(qū)域存儲處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)城存儲變量和進程執(zhí)行期間使用的動態(tài)分配的內(nèi)存;堆棧區(qū)域存儲看活動過程調(diào)用的指令和本地變量。
第二,進程是一個"執(zhí)行中的程序"。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操作系統(tǒng)執(zhí)行之),它才 能成為一個活動的實體,我們稱其為進程。
第三,進程是操作系統(tǒng)中最基本、重要的概念。是多道程序系統(tǒng)岀現(xiàn)后,為了刻圓系統(tǒng)內(nèi)部出現(xiàn)的 動態(tài)情況,箍述系統(tǒng)內(nèi)部眢道程序的活動規(guī)律引進的一個概念,所有多道程序設(shè)計搡作系統(tǒng)都建立在進程的基礎(chǔ)上。
本文為了說明例子,用中文作為變量寫在了程序里面,一般編程最好不要那么寫
僵尸進程
僵尸進程是當(dāng)子進程比父進程先結(jié)束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵尸進程。如果父進程先退出 ,子進程被init接管,子進程退出后init會回收其占用的相關(guān)資源
我們都知道進程的工作原理。我們啟動一個程序,開始我們的任務(wù),然后等任務(wù)結(jié)束了,我們就停止這個進程。 進程停止后, 該進程就會從進程表中移除。
你可以通過 System-Monitor 查看當(dāng)前進程。
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)中,一個進程結(jié)束了,但是他的父進程沒有等待(調(diào)用wait / waitpid)他, 那么他將變成一個僵尸進程。 但是如果該進程的父進程已經(jīng)先結(jié)束了,那么該進程就不會變成僵尸進程, 因為每個進程結(jié)束的時候,系統(tǒng)都會掃描當(dāng)前系統(tǒng)中所運行的所有進程, 看有沒有哪個進程是剛剛結(jié)束的這個進程的子進程,如果是的話,就由Init 來接管他,成為他的父進程
孤兒進程
在操作系統(tǒng)領(lǐng)域中,孤兒進程指的是在其父進程執(zhí)行完成或被終止后仍繼續(xù)運行的一類進程。這些孤兒進程將被init進程(進程號為1)所收養(yǎng),并由init進程對它們完成狀態(tài)收集工作。
代碼示例
from multiprocessing import Process import time def 要運行的函數(shù)(): print('我是子進程A') time.sleep(5) print('我是子進程B') if __name__ == '__main__': p = Process(target=要運行的函數(shù)) p.start() print('我是主進程')
效果
守護進程
守護進程是一個在后臺運行并且不受任何終端控制的進程。Unix操作系統(tǒng)有很多典型的守護進程(其數(shù)目根據(jù)需要或20—50不等),它們在后臺運行,執(zhí)行不同的管理任務(wù)。
用戶使守護進程獨立于所有終端是因為,在守護進程從一個終端啟動的情況下,這同一個終端可能被其他的用戶使用。例如,用戶從一個終端啟動守護進程后退出,然后另外一個人也登錄到這個終端。用戶不希望后者在使用該終端的過程中,接收到守護進程的任何錯誤信息。同樣,由終端鍵入的任何信號(例如中斷信號)也不應(yīng)該影響先前在該終端啟動的任何守護進程的運行。雖然讓服務(wù)器后臺運行很容易(只要shell命令行以&結(jié)尾即可),但用戶還應(yīng)該做些工作,讓程序本身能夠自動進入后臺,且不依賴于任何終端。
守護進程沒有控制終端,因此當(dāng)某些情況發(fā)生時,不管是一般的報告性信息,還是需由管理員處理的緊急信息,都需要以某種方式輸出。Syslog 函數(shù)就是輸出這些信息的標準方法,它把信息發(fā)送給 syslogd 守護進程。
代碼實現(xiàn)
from multiprocessing import Process import time def 要運行的函數(shù)(變量): print('%s負責(zé)剝削的資本家正在運行'% 變量) time.sleep(3) print('%s負責(zé)剝削的資本家正在終止' % 變量) if __name__ == '__main__': A = Process(target=要運行的函數(shù),args=('資本家',)) A.daemon = True # 將進程A設(shè)置成守護進程 本行代碼要放在start方法上面才有效,否則會報錯 A.start() print('剝削的資本家被終止了')
效果
互斥鎖
在編程中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。每個對象都對應(yīng)于一個可稱為" 互斥鎖" 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。
比如,一群人中,出現(xiàn)了一個工賊,但是,人們覺得用拳頭不爽,但是狼牙棒只有一個,于是大家要開始搶狼牙棒,我們就對狼牙棒上一個互斥鎖
代碼實現(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ù)不能運行也要寫個pass上去,這是為了避免因為小問題導(dǎo)致整個程序無法運行的情況 # 搶狼牙棒 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))#每個人的手速不同 # 判斷當(dāng)前是否有狼牙棒 if dic.get('狼牙棒_num') > 0: # 修改數(shù)據(jù)庫 搶狼牙棒 dic['狼牙棒_num'] -= 1 # 寫入數(shù)據(jù)庫 with open('data.txt','w',encoding='utf8') as f: json.dump(dic,f) print('群眾%s搶狼牙棒成功'%i) else: print('群眾%s搶狼牙棒失敗'%i) # 整合上面兩個函數(shù) def run(i, mutex): search(i) # 給狼牙棒環(huán)節(jié)加鎖處理 # 搶鎖 mutex.acquire() buy(i) # 釋放鎖 mutex.release() if __name__ == '__main__': # 在主進程中生成一把鎖 讓所有的子進程搶 mutex = Lock() for i in range(1,11): p = Process(target=run, args=(i, mutex)) p.start()
效果
文件格式
總結(jié)
到此這篇關(guān)于對python中進程的幾個概念理解的文章就介紹到這了,更多相關(guān)python進程概念理解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在?Python?中使用變量創(chuàng)建文件名的方法
這篇文章主要介紹了在?Python?中使用變量創(chuàng)建文件名,格式化的字符串文字使我們能夠通過在字符串前面加上 f 來在字符串中包含表達式和變量,本文給大家詳細講解,需要的朋友可以參考下2023-03-03Python 語法錯誤:"SyntaxError: invalid charac
本文給大家分享Python 語法錯誤:“SyntaxError: invalid character in identifier“,原因及解決方法,文末給大家補充介紹了Python出現(xiàn)SyntaxError: invalid syntax的原因總結(jié),感興趣的朋友跟隨小編一起學(xué)習(xí)吧2023-02-02對Pytorch神經(jīng)網(wǎng)絡(luò)初始化kaiming分布詳解
今天小編就為大家分享一篇對Pytorch神經(jīng)網(wǎng)絡(luò)初始化kaiming分布詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python爬蟲庫requests-html進行HTTP請求HTML解析等高級功能應(yīng)用
這篇文章主要為大家介紹了Python爬蟲庫requests-html進行HTTP請求HTML解析JavaScript渲染以及更高級的功能應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12python調(diào)用Moxa PCOMM Lite通過串口Ymodem協(xié)議實現(xiàn)發(fā)送文件
這篇文章主要介紹了python調(diào)用Moxa PCOMM Lite通過串口Ymodem協(xié)議實現(xiàn)發(fā)送文件,需要的朋友可以參考下2014-08-08Python預(yù)測2020高考分數(shù)和錄取情況
這篇文章主要介紹了Python預(yù)測2020高考分數(shù)和錄取情況可能是這樣,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07