Python中建立程序的方法,以及併發並行,殭屍程序,孤兒程序的相關概念
阿新 • • 發佈:2018-11-25
一、併發與並行
並行:多個計算機核心在同時處理多個任務,這時多個任務間是並行關係
併發:同時處理多個任務,但是核心在多個任務間不斷地切換,達到好像都在處理執行的效果,但實際一個時間點核心只能處理其中一個任務。
二、程序
程序與執行緒是實現多工程式設計的實施方案 程序與執行緒: 程式:是一個可執行的檔案,是靜態的佔有磁碟空間,不佔有計算機的執行資源 程序: 是一個動態過程的描述,佔有計算機的資源,有一定的生命週期 *同一個程式的不同執行過程是不同的程序,佔用資源和生命週期都不一樣。 1、程序的建立流程: (1)使用者空間通過執行程式或者呼叫介面發起建立程序 (2)作業系統接受使用者請求,開始建立程序 (3)作業系統分配計算機資源,確定程序狀態,開闢程序空間等工作 (4)作業系統將建立好的程序提供給應用程式使用 2、關於程序的概念 PCB(程序控制塊): 在記憶體中開闢的一塊空間,用來記錄程序的資訊。 程序控制塊是作業系統查詢識別程序的標誌。 cpu時間片:如果一個程序佔有計算機核心,我們稱為該程序佔有計算機cpu時間片 *多個任務之間是爭奪cpu的關係 *誰佔有cpu最終是作業系統決定 程序的狀態: 三態 : *就緒態:程序具備執行條件,等待系統分配資源 *執行態:程序佔有cpu處於執行態 *等待態:程序暫時不具備執行條件,阻塞等待滿足條件後再執行 五態(三態基礎上增加新建態,終止態): *新建態:建立一個新的程序,獲取資源的過程 *終止態:程序執行結束,資源釋放回收的過程 程序的特徵: (1)程序之間執行互不影響,各自獨立執行 (2)程序是作業系統資源分配的最小單位 (3)每個程序空間獨立,各自佔有一定的虛擬記憶體
三、多程序程式設計
import os pid = os.fork() 功能:建立新的程序 引數:無 返回值:失敗返回一個負數, 成功:在原有程序中返回新的程序的PID號,在新的程序中返回0 *子程序會複製父程序全部程式碼段,包括fork之前產生的記憶體空間 *子程序從fork的下一句開始執行,與父程序互不干擾 *父子程序的執行順序是不一定的,父子程序共用一個終端 *父子程序通常會根據fork返回值的差異選擇執行不同的程式碼,所以if結構幾乎是fork的固定搭配 *父子程序空間獨立,操作的都是本空間的內容,互不影響 *子程序也有自己的特特性,比如PID號,PCB,命令集等 程序相關的函式: 獲取程序 PID:os.getpid() 功能:獲取當前程序的程序號 返回值:返回程序號 os.getppid() 功能:獲取當前程序父程序的的PID號 返回值:返回程序號 os._exit(status) 功能:程序退出 引數:程序的退出狀態 sys.exit(status) 功能:程序退出 引數:數字表示退出狀態,不寫預設為0 字串,表示退出時列印的內容 *sys.exit() 可以通過捕獲SystemExit異常阻止退出 孤兒程序:父程序先於子程序退出,此時子程序稱為孤兒程序 *孤兒程序會被作業系統指定的程序收養,系統程序就成為孤兒程序的新的父程序 殭屍程序:子程序先於父程序退出,但是父程序沒有處理子程序的退出狀態,此時子程序就會成為殭屍程序 *殭屍程序會存留少量PCB資訊在記憶體中,大量的殭屍程序會消耗系統資源,應該避免殭屍程序的產生
四、如何避免殭屍程序產生
*處理子程序退出狀態 pid,status = os.wait() 功能:在父程序中阻塞等待處理子程序退出 返回值:pid 退出的子程序的PID號 tatus 獲取子程序的退出狀態 pid,status = os.waitpid(pid,option) 功能:在父程序中阻塞等待處理子程序退出 引數:pid -1 表示等待任意子程序退出 >0 表示等待對應PID號的子程序退出 option 0 表示阻塞等待 WNOHANG 表示非阻塞 *讓父程序先退出 (1)父程序建立子程序等待子程序退出 (2)子程序建立二級子程序後立即退出 (3)二級子程序成為孤兒
五、multiprocessing模組建立程序
1、需要將要執行的事情封裝為函式
2、使用multiprocessing模組中Process類建立程序物件
3、通過物件屬性設定和Process的初始化函式對程序進行設定,繫結要執行的函式
4、啟動程序,會自動執行程序繫結的函式
5、完成程序的回收
Process()
功能:建立程序物件
引數:name 程序名稱 Process-1
target 繫結函式
args 元組 給target函式按照位置傳參
kwargs 字典 給target函式按照鍵值對傳參
p.start()
功能:啟動程序
*target函式會自動執行,此時程序真正被建立
p.join([timeout])
功能:阻塞等待回收子程序
引數:超時時間
*使用multiprocessing建立子程序,同樣子程序複製父程序的全部程式碼段,父子程序各自執行互不影響,父子程序有各自的執行空間
*如果不使用join回收子程序則子程序退出後會成為殭屍程序
*使用multiprocessing建立程序往往父程序只是用來建立程序回收程序