程序(多程序實現多工)
阿新 • • 發佈:2018-12-09
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("-----------")