一.程序理論
1.程序是資源配置設定的最小機關.
2.程序排程就是多個程序在作業系統的控制下被CPU執行,去享用計算機的資源.
先來先服務
短作業優先
時間片輪轉
多級回報隊列
3.程序排程的過程是不能夠随意被程式影響的
4.程序的三個狀态: 就緒 運作 阻塞
就緒狀态: 當程序已配置設定到除CPU以外的所有必要的資源,隻要獲得處理機便可立即執行,這時的程序狀态稱為就緒狀态。
運作轉态: 當程序獲得處理機,其程式正在處理機上執行,此時的程序狀态稱為運作狀态.
阻塞狀态: 正在執行的程式,由于等待某個事情發生而無法執行時,便放棄處理機而處于阻塞狀态,引起程序阻塞的事件有多種,等待IO完成,
等待信件,申請緩沖區不能滿足.
eg:
程式在開始運作之後,并不是立即開始執行代碼,而是會進入就緒狀态,等待作業系統排程開始運作
import time
print("程式開始運作") 程式運作狀态
name=input(">>>") 等待使用者輸入 程式進入阻塞狀态
使用者輸入後程序并不是立即執行,而是進入就緒狀态,等待作業系統的排程繼續運作
print(name) 運作狀态
time.sleep(1) 阻塞狀态
就緒狀态
print("程式結束運作") 運作狀态
結束
5.程序三狀态轉換流程圖:
a.建立--(送出)--> 就緒--(程序排程)--> 運作--(釋放)--> 退出
b.建立--(送出)--> 就緒--(程序排程)--> 運作--(時間片結束)--> 就緒
c.建立--(送出)--> 就緒--(程序排程)--> 運作--(事件請求IO)--> 阻塞--(事件發生)--> 就緒
6.PID 和 PPID
PID: ProcessID 程序ID
PPID: parent processID 父程序ID (父程序回收子程序的一些資源)
二.程序的建立與結束
1.程序的建立
引入:但凡是硬體,都需要有作業系統去管理,隻要有作業系統就有程序的概念,就需要有建立程序的方法.
對于通用系統(跑很多應用程式),需要有系統運作過程中建立或撤銷程序的能力.主要有四種形式建立新的程序.
(1).系統初始化(檢視程序 linux中用ps指令,windows中用任務管理器,前台程序負責與使用者互動,背景運作的程序與使用者無關,運作在
運作在背景并且隻在需要時才喚醒的程序,稱為守護程序,(如"電子郵件","web頁面","新聞","列印")
(2).一個程序在運作過程中開啟了子程序(os)
(3).使用者的互動式請求,而建立一個新程序("輕按兩下qq")
(4).一個批處理作業的初始化(隻在大型機的批處理系統中運用).
建立子程序unix和windows的異同:
相同點:程序建立後,父程序和子程序有各自不同的位址空間(多道技術要求實體層面實作程序之間記憶體的隔離),任何一個程序
的在其位址空間中的修改都不會影響到另外一個程序。
不同點: 在UNIX中,子程序的初始位址空間是父程序的一個副本,提示:子程序和父程序是可以有隻讀的共享記憶體區的。但是對于
windows系統來說,從一開始父程序與子程序的位址空間就是不同的。
2.程序的結束
(1)正常退出(自願,使用者點選互動式頁面的叉号,或程式執行完畢調用發起系統調用正常退出,在linux中用exit,在windows中用ExitProcess)
(2)出錯退出(自願,python a.py中a.py不存在)
(3)嚴重錯誤(非自願,執行非法指令,如引用不存在的記憶體,可以捕捉異常,try...except...)
(4)被其他程序殺死(非自願,如右鍵結束程序
三.在python程式中的程序操作
multiprocess不是一個子產品而是python中一個操作、管理程序的包。 之是以叫multi是取自multiple的多功能的意思,在這個包中幾
乎包含了和程序有關的所有子子產品。由于提供的子子產品非常多,為了友善大家歸類記憶,
我将這部分大緻分為四個部分:建立程序部分,程序同步部分,程序池部分,程序之間資料共享。
multiprocess.process
1.process子產品介紹: process子產品是一個建立程序的子產品.借助這個子產品,就可以完成程序的建立.
Process([group [, target [, name [, args [, kwargs]]]]]),由該類執行個體化得到的對象,表示一個子程序中的任務(尚未啟動)
強調:
(1). 需要使用關鍵字的方式來指定參數
(2). args指定傳給target函數的位置參數,是一個元組形式,必須有逗号
參數介紹:
(1) group參數未使用,值始終為None
(2)target表示調用對象,即子程序要執行的任務
(3) args表示調用對象的位置參數元組,args=(1,2,'egon',)
(4) kwargs表示調用對象的字典,kwargs={'name':'egon','age':18}
(5) name為子程序的名稱
方法介紹:
(1) p.start():啟動程序,并調用該子程序中的p.run()
(2) p.run():程序啟動時運作的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實作該方法
(3) p.terminate():強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了僵屍程序,使用該方法需要特别小心這
種情況。如果p還儲存了一個鎖那麼也将不會被釋放,進而導緻死鎖
(4) p.is_alive():如果p仍然運作,傳回True
(5) p.join([timeout]):主線程等待p終止(強調:是主線程處于等的狀态,而p是處于運作的狀态)。timeout是可選的逾時時間,需要強
調的是,p.join隻能join住start開啟的程序,而不能join住run開啟的程序
在windows中使用process子產品的注意事項:
在Windows作業系統中由于沒有fork(linux作業系統中建立程序的機制),在建立子程序的時候會自動 import 啟動它的這個檔案,
而在 import 的時候又執行了整個檔案。是以如果将process()直接寫在檔案中就會無限遞歸建立子程序報錯。是以必須把建立子程序
的部分使用if __name__ ==‘__main__’ 判斷保護起來,import 的時候 ,就不會遞歸運作了。
四.建立程序
(一).建立一個程序 并給子程序傳參
import os
import time
from multiprocessing import Process
def func(num): #形參num
print("in func",num,os.getpid(),os.getppid()) #4 in func 1 4376 3180 #6 in func 2 20072 3180
print(__name__) #5 __mp_main__ #7 __mp_main__
if __name__=="__main__":
print("in main",os.getpid(),os.getppid()) #1 in main 20208 20572
p=Process(target=func,args=(1,)) #關鍵字傳參
p.start()
p1=Process(target=func,args=(2,)) #用args,必須是元組形式( , )
p1.start()
print(__name__) #2 __main__
print("主程序結束") #3 主程序結束
原理:
if __name__ == '__main__':
使用python都是調用作業系統的指令來啟動程序
同樣使用python 不同的作業系統的操作是不同的
對于windows來說 必要加if __name__ == '__main__':
對于linux ios來說 不必要加if __name__ == '__main__':
(二).其他方法和屬性
1.開啟多個子程序
import os
from multiprocessing import Process #Process 是一個類
def func(num): #形參num
print("in func",num,os.getpid(),os.getppid())
print(__name__) # __mp_main__
if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
for i in range(10):
p=Process(target=func,args=(i,)) # 關鍵字傳參 必須是元組形式,用逗号隔開.
p.start() #向作業系統送出開啟一個子程序的申請
print("主程序結束")
2.join 方法
import os
import time
from multiprocessing import Process
def func(num):
time.sleep(1)
print("in func",num,os.getpid(),os.getppid())
if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p=Process(target=func,args=(1,))
p.start() #不是運作一個程式,而是調用作業系統的指令,要建立子程序
p.join() #阻塞直到p這個子程序執行完畢之後再繼續執行後面的代碼
print('主程序的代碼結束')
3.一批任務用join
import os
import time
from multiprocessing import Process
def func(num):
print("in func",num,os.getpid(),os.getppid())
if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p_l = []
for i in range(10):
p=Process(target=func,args=(i,))
p.start()
p_l.append(p)
print(p_l)
for p in p_l:
p.join()
print("主程序代碼結束")
4.is_alive terminate
import os
import time
from multiprocessing import Process
def func(num):
print("in func",num,os.getpid(),os.getppid())
if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p=Process(target=func,args=(1,))
p.start()
print(p.is_alive()) # True 檢測程序是否在執行任務
p.join() # 阻塞 等子程序結束後再執行後面的代碼
print(p.is_alive()) #False 子程序任務已經結束
p.terminate() #強制結束子程序 非阻塞
print(p.is_alive())
5.用面向對象的方式開啟子程序
import os
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,num):
super().__init__()
self.num=num
def run (self):
print("in run",self.num,os.getpid(),os.getppid())
if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p=MyProcess(1)
p.start()
轉載于:https://www.cnblogs.com/J-7-H-2-F-7/p/9385403.html