并發編程
1、多道技術(基于單核背景下產生)
單道:指的是一條道路走到黑 --> 串行
比如:a,b需要使用cpu,a先試用,b等待a使用完成后,b才能使用cpu
多道:一條道路分配走
比如:a,b需要使用cpu,a先使用,b等待a,直到a進入“IO或執行時間過長”,a會(切換+保存狀態),然后b可以使用cpu,待b執行遇到“IO或執行時間過長”,再將cpu執行權限交給a,直到兩個程式結束

空間上的復用:(*******)
多個程式使用一個cpu
時間上的復用:(*******)
切換 + 保存狀態
1.當執行程式遇到IO時,作業系統會將cpu的執行權限剝奪
優點:
cpu的執行效率提高
2.當執行程式遇到執行時間過長時,作業系統會將cpu的執行權限剝奪
缺點:
程式的執行效率低
2、并發與并行
并發:在單核(1個cpu)情況下,當執行a,b兩個程式時,a先執行,當a遇到IO時,b開始爭搶cpu的執行權限,再讓b執行,看起來像同時運行
并行:在多核(多個cpu)情況下,當執行a,b兩個程式時,a,b同時執行,他們是真正意義上的同時運行

3、行程
(1)什么是行程
行程是一個資源單位
(2)行程與程式
程式:一堆代碼檔案
行程:執行代碼的程序,稱之為行程
(3)行程調度(了解)
① 先來先服務調度演算法
比如程式 a,b,若a先來,則先讓a先服務,待a服務完畢后,b再服務
缺點:
執行效率低
② 短作業優先調度
執行時間越短,則先調度
缺點:
導致執行時間長的程式,需要等待所有時間短的程式執行完畢后,才能執行
現代作業系統的行程電鍍演算法: 時間片輪轉法 + 多級反饋佇列(知道)
③ 時間片輪轉法
比如同時有10個程式需要執行,作業系統會給你10秒,然后時間片輪轉法會將10秒分成10等份,
④ 多級反饋佇列
1級別佇列:優先級最高,先執行此佇列中的程式
2級別佇列:優先級以此類推
3級別佇列:...
4、同步與異步
同步與異步指的是 "提交任務的方式"
同步(串行):
兩個a,b程式都要提交并執行,假如a先提交執行,b必須等a執行完成后,b才能提交任務
異步(并發):
兩個a,b程式都要提交并執行,假如a先提交執行,b無需等a執行完成,就可以直接提交任務
5、阻塞與非阻塞
阻塞:
凡是遇到IO操作都會阻塞
IO操作:
input()
output()
time.sleep()
檔案的讀寫
資料的傳輸
非阻塞(不等待):
只要不遇到IO阻塞,其他都是非阻塞(比如計算從1到100萬的和)
6、行程的三種狀態
就緒態:
同步和異步
運行態:程式的運行時間過長 ---> 會將程式回傳給就緒態
非阻塞
阻塞態:
遇到IO操作
7、行程的兩種創建方式(代碼)
方式1:直接呼叫Process類
例1:
import time from multiprocessing import Process def task(): # 任務 print("start...") time.sleep(3) print("end...") if __name__ == '__main__': # target=任務(函式地址) ---> 創建一個子行程 p_obj = Process(target=task) # 告訴作業系統去創建一個子行程 p_obj.start() # 告訴主行程,等待子行程結束后,再執行主行程 p_obj.join() print("正在執行當前主行程")
執行結果:
start...
end...
正在執行當前主行程
例2:
import time from multiprocessing import Process def task(name): # 任務 print(f"start...{name}的子行程") time.sleep(3) print(f"end...{name}的子行程") if __name__ == '__main__': # target=任務(函式地址) ---> 創建一個子行程 # 異步提交3個任務 (3個子行程) p_obj1 = Process(target=task, args=("apple", )) p_obj2 = Process(target=task, args=("orange", )) p_obj3 = Process(target=task, args=("banana", )) # 告訴作業系統去創建一個子行程 p_obj1.start() p_obj2.start() p_obj3.start() # 告訴主行程,等待子行程結束后,再執行主行程 p_obj1.join() p_obj2.join() p_obj3.join() print("正在執行當前主行程")
執行結果:
# apple、orange、banana三個行程同時提交 start...apple的子行程 start...orange的子行程 start...banana的子行程 end...apple的子行程 end...orange的子行程 end...banana的子行程 正在執行當前主行程
方式二:繼承Process類
import time from multiprocessing import Process class MyProcess(Process): def run(self): print(f"start...{self.name}的子行程") time.sleep(3) print(f"end...{self.name}的子行程") if __name__ == '__main__': # 定義一個空串列,將所有的子行程放進去并for回圈出來告訴主行程先執行子行程 list1 = [] # 假設10個行程 for i in range(10): obj = MyProcess() # 告訴作業系統去創建一個子行程 obj.start() list1.append(obj) for obj in list1: # 告訴主行程,等待子行程結束后,再執行主行程 obj.join() print("正在執行當前主行程")
執行結果:
# 10個行程同時提交 start...MyProcess-1的子行程 start...MyProcess-2的子行程 start...MyProcess-3的子行程 start...MyProcess-4的子行程 start...MyProcess-5的子行程 start...MyProcess-6的子行程 start...MyProcess-7的子行程 start...MyProcess-8的子行程 start...MyProcess-9的子行程 start...MyProcess-10的子行程 end...MyProcess-1的子行程 end...MyProcess-2的子行程 end...MyProcess-3的子行程 end...MyProcess-4的子行程 end...MyProcess-5的子行程 end...MyProcess-6的子行程 end...MyProcess-7的子行程 end...MyProcess-8的子行程 end...MyProcess-9的子行程 end...MyProcess-10的子行程 正在執行當前主行程
8、問答題
(1)在單核情況下是否可以實作并行?
不可以,并行只能在多核情況下實作
(2)阻塞與同步是一樣的嗎?非阻塞與異步是一樣的嗎?
不一樣
同步與異步:提交任務的方式
阻塞與非阻塞:行程的狀態
補充:
異步非阻塞:異步非阻塞可將cpu的利用率最大化! 用在通過并發對程式行程操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/202763.html
標籤:Python
