天天看點

python全棧開發 * 程序理論 程序建立 * 180724

一.程序理論      
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