1. 程式人生 > >程序(多程序實現多工)

程序(多程序實現多工)

    1.程序
        1.程式:靜態的,一個.py檔案就是儲存在硬碟中的,屬於靜態的概念
        2.程序:動態的,程式碼加所需的資源 = 程序,是作業系統分配程式執行資源的單位,多程序也是可以滿足多工的
    2.程序的狀態有:
        就緒態:執行的條件都滿足,就等CPU執行
        執行態:CPU正在執行的
        等待態:等待某些條件滿足,例如等待訊息回覆,等待同步鎖等
    3.程序的建立方法一:
        1.通過multiprocessing模組建立子程序
            1.匯入模組multiprocessing
            2.準備任務函式(用來編寫程序程式碼)
            3.由multiprocessing模組的Process建立子程序
            4.執行子程序
    4.程序的建立方法二-程序池POOL:
        1.程序池是什麼,有什麼用?
            程序池指當需要在建立多個子程序時,建立一個程序池用來構建更多的子程序
            程序池可以控制程序的數量,重複利用程序物件,減少建立和銷燬過程的開銷

        2.程序池的使用:
            1.建立程序池,也可以設定程序池的最大值,如果沒有寫值,則預設當前主機cpu核數
                multiprocessing.Pool()
            2.apply_async(func[,args[,kwds]])
                任務非同步執行:指你做一個任務,我同時也開啟一個程序做我的任務
                --func:子程序要執行的函式
                --args:向子程序執行的函式傳遞可變引數
                --kwds:向子程序執行的函式傳遞關鍵字引數
            3.close():關閉程序池,不在接收新的任務請求
            4.terminate():終止程序池中所有的子程序
            5.join():
                process.join:阻塞主程序,直到程序池中的子程序執行完畢
                注意:必須在close或terminate之後使用
1.通過multiprocessing模組建立子程序
    1.匯入模組multiprocessing
    2.準備任務函式(用來編寫程序程式碼)
    3.由multiprocessing模組的Process建立子程序
    4.執行子程序

    #.匯入模組
import multiprocessing
#2.準備任務函式
import time
def work1():
    while True:
        time.sleep(1)
        print("---work1---")

def work2():
    while True:
        time.sleep(1
) print("---work2---") if __name__ == '__main__': #由multiprocessing模組的Process建立子程序 p1 = multiprocessing.Process(target=work1) p2 = multiprocessing.Process(target=work2) #執行子程序 p1.start() p2.start()
2.程序的建立方法二-程序池POOL:
    1.建立程序池,也可以設定程序池的最大值,如果沒有寫值,則預設當前主機cpu核數
    multiprocessing.Pool()
    2.
apply_async(func[,args[,kwds]]) 任務非同步執行:指你做一個任務,我同時也開啟一個程序做我的任務 --func:子程序要執行的函式 --args:向子程序執行的函式傳遞可變引數 --kwds:向子程序執行的函式傳遞關鍵字引數 3.close():關閉程序池,不在接收新的任務請求 4.terminate():終止程序池中所有的子程序 5.join(): process.join:阻塞主程序,直到程序池中的子程序執行完畢 注意:必須在close或terminate之後使用 6.參考程式碼: import multiprocessing import random import time def work1(): for i in range(6): time.sleep(1) print("----work1----") def work2(): for i in range(6): time.sleep(1) print("----work2----") def work3(): for i in range(3): time.sleep(1) print("----work3----") def work4(): for i in range(3): time.sleep(1) print("----work4----") if __name__ == '__main__': #通過程序池一樣可以進行多工,但是這種方式用於當任務數比較多的時候 #當任務數大於程序池的最大值時,則會有一部分程序處於等待狀態,一旦進 # 程池裡的程式碼執行完畢即會切向另一個子程序 pool = multiprocessing.Pool(processes=3) pool.apply_async(func=work1) pool.apply_async(func=work2) pool.apply_async(func=work3) pool.apply_async(func=work4) pool.close() pool.join()#阻塞主程序,直到程序池中的子程序執行完畢,在解阻塞注意這裡的join只能在.close或者.terminate後進行,

守護程序:

2.守護程序
    1.什麼是守護程序?
    主要做與業務無關的任務,無關緊要的任務,比如記憶體垃圾回收,計時等,
    也就說當子程序是守護程序時,主程序結束後會傳送一個訊息給子程序,
    子程序收到後立即結束,主程序不會等待守護程序執行完在結束,
    因為守護程序是無關緊要的一些程序
    一般情況下,主程序建立的是非守護程序

2.守護程序如何開啟
    通過程序名.daemon = Ture
    參考程式碼:
        #.匯入模組
        import multiprocessing
        #2.準備任務函式
        import time

def work1():
    while True:
        time.sleep(1)
        print("---work1---")

def work2():
    while True:
        time.sleep(1)
        print("---work2---")

if __name__ == '__main__':

    #由multiprocessing模組的Process建立子程序
    p1 = multiprocessing.Process(target=work1)
    p2 = multiprocessing.Process(target=work2)

    #開啟守護程序,需要在開啟前做
    #當開啟守護程序後,主程序很快就結束了所有程序,子程序也會被關閉,所以不會列印
    p1.daemon = True
    p2.daemon = True

    #執行子程序
    p1.start()
    p2.start()

    print("-----------")