進程
第一,進程是一個容器。每一個進程都有它自己的地址空間,一般情況下,包括文本區域( text region)、數據區域(data region)和堆棧(stack region)。
文本區域存儲處理器執行的代碼;數據區城存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲看活動過程調用的指令和本地變量。
第二,進程是一個"執行中的程序"。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操作系統執行之),它才 能成為一個活動的實體,我們稱其為進程。
第三,進程是操作系統中最基本、重要的概念。是多道程序系統縵趾,為了刻A系統炔砍魷值 動態情況,箍述系統炔寬蟮萊絳虻幕疃規律引進的一個概念,所有多道程序設計搡作系統都建立在進程的基礎上。
本文為了說明例子,用中文作為變量寫在了程序里面,一般編程最好不要那么寫
僵尸進程
僵尸進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵尸進程。如果父進程先退出 ,子進程被init接管,子進程退出后init會回收其占用的相關資源
我們都知道進程的工作原理。我們啟動一個程序,開始我們的任務,然后等任務結束了,我們就停止這個進程。 進程停止后, 該進程就會從進程表中移除。
你可以通過 System-Monitor 查看當前進程。
In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系統中,一個進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那么他將變成一個僵尸進程。 但是如果該進程的父進程已經先結束了,那么該進程就不會變成僵尸進程, 因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init 來接管他,成為他的父進程
孤兒進程
在操作系統領域中,孤兒進程指的是在其父進程執行完成或被終止后仍繼續運行的一類進程。這些孤兒進程將被init進程(進程號為1)所收養,并由init進程對它們完成狀態收集工作。
代碼示例
from multiprocessing import Process import time def 要運行的函數(): print('我是子進程A') time.sleep(5) print('我是子進程B') if __name__ == '__main__': p = Process(target=要運行的函數) p.start() print('我是主進程')
效果
守護進程
守護進程是一個在后臺運行并且不受任何終端控制的進程。Unix操作系統有很多典型的守護進程(其數目根據需要或20―50不等),它們在后臺運行,執行不同的管理任務。
用戶使守護進程獨立于所有終端是因為,在守護進程從一個終端啟動的情況下,這同一個終端可能被其他的用戶使用。例如,用戶從一個終端啟動守護進程后退出,然后另外一個人也登錄到這個終端。用戶不希望后者在使用該終端的過程中,接收到守護進程的任何錯誤信息。同樣,由終端鍵入的任何信號(例如中斷信號)也不應該影響先前在該終端啟動的任何守護進程的運行。雖然讓服務器后臺運行很容易(只要shell命令行以&結尾即可),但用戶還應該做些工作,讓程序本身能夠自動進入后臺,且不依賴于任何終端。
守護進程沒有控制終端,因此當某些情況發生時,不管是一般的報告性信息,還是需由管理員處理的緊急信息,都需要以某種方式輸出。Syslog 函數就是輸出這些信息的標準方法,它把信息發送給 syslogd 守護進程。
代碼實現
from multiprocessing import Process import time def 要運行的函數(變量): print('%s負責剝削的資本家正在運行'% 變量) time.sleep(3) print('%s負責剝削的資本家正在終止' % 變量) if __name__ == '__main__': A = Process(target=要運行的函數,args=('資本家',)) A.daemon = True # 將進程A設置成守護進程 本行代碼要放在start方法上面才有效,否則會報錯 A.start() print('剝削的資本家被終止了')
效果
互斥鎖
在編程中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性。每個對象都對應于一個可稱為" 互斥鎖" 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。
比如,一群人中,出現了一個工賊,但是,人們覺得用拳頭不爽,但是狼牙棒只有一個,于是大家要開始搶狼牙棒,我們就對狼牙棒上一個互斥鎖
代碼實現
from multiprocessing import Process, Lock import json import time import random # 查狼牙棒 def search(i): # 文件操作讀取狼牙棒數 with open('data','r',encoding='utf8') as f: dic = json.load(f) print('群眾%s想要獲取余狼牙棒:%s'%(i, dic.get('狼牙棒_num'))) # 字典取值不能用[]的形式 應該使用get,即使函數不能運行也要寫個pass上去,這是為了避免因為小問題導致整個程序無法運行的情況 # 搶狼牙棒 1.先查 2.再搶 def buy(i): # 先查狼牙棒 with open('data.txt','r',encoding='utf8') as f: dic = json.load(f) # 模擬網絡延遲 time.sleep(random.randint(1,5))#每個人的手速不同 # 判斷當前是否有狼牙棒 if dic.get('狼牙棒_num') > 0: # 修改數據庫 搶狼牙棒 dic['狼牙棒_num'] -= 1 # 寫入數據庫 with open('data.txt','w',encoding='utf8') as f: json.dump(dic,f) print('群眾%s搶狼牙棒成功'%i) else: print('群眾%s搶狼牙棒失敗'%i) # 整合上面兩個函數 def run(i, mutex): search(i) # 給狼牙棒環節加鎖處理 # 搶鎖 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()
效果
文件格式
總結
到此這篇關于對python中進程的幾個概念理解的文章就介紹到這了,更多相關python進程概念理解內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/CSDNXXCQ/article/details/120687908