python-同步和非同步、阻塞和非阻塞、序列和並行、並行和併發、密集型、執行緒和程序的相關概念
1. 同步和非同步
關注的是訊息的通訊機制,描述的是一種行為方式,是多個任務之間的關係。
① 同步: 呼叫者主動等待被呼叫方返回結果,在沒有返回結果之前,就一直專職等待。
千萬不要把計算機中“同步”理解成“同時執行”。
② 非同步:呼叫者傳送請求請求,不會專職等待被呼叫方返回結果,當被呼叫方有結果之後,再通知呼叫者,再繼續執行剛才的任務。
2. 阻塞和非阻塞
描述的是一個任務的某一種狀態。
① 阻塞:呼叫者當呼叫了被呼叫者時,被呼叫者沒有返回結果之前,呼叫者就一直等待,描述等待的這個狀態,為阻塞狀態。
② 非阻塞:呼叫者再沒有得到被呼叫者返回結果之前,會去執行其他的任務,描述不會等待這個狀態,為非阻塞。
概念的區分
同步非同步和阻塞與非阻塞
阻塞與非阻塞和同步與非同步之間沒有必然的聯絡,是兩個概念 ,兩個角度 阻塞是使用了同步機制的結果 非阻塞是使用了非同步機制的結果。
① 非阻塞是不是一定就意味著非同步? 不是,非阻塞只能決定當前任務的狀態(可以不等著),是不是要去做其他的任務,不是由非阻塞決定的,是由非同步決定的。
② 阻塞是不是一定意味著任務之間一定不是非同步關係? 是
③ 非同步是不是意味著當前的任務處於非阻塞狀態? 是
④ 同步一定也意味著某一個時刻,某一個任務處於阻塞狀態? 是
3. 序列和並行
是任務的執行方式
① 序列:多個任務時,各個任務按照順序執行,執行完一個任務之後,才能執行下一個任務。可以理解成同步的概念,兩個任務是序列執行的===兩個任務之間的關係是同步機制
② 並行:多個任務同時執行,意味著多個任務之間是非同步機制。
4. 並行和併發
同時處理的含義,只有【並行】是真正意義上同時處理。
① 時間上: 並行指的是多個時間同一個時刻發生。 併發是多個事件在同一個時間間隔執行。其實是切換時間片輪流執行。微觀的角度(序列)
② 作用點上: 並行作用在多個實體上多個事件 併發作用在一個實體上的多個事件
③ 處理個數: 並行,多個處理器處理多個任務 併發,一個處理器處理多個任務
5. IO密集型和計算密集型
程式(任務)的型別 IO密集型:cpu佔用率比較低,IO佔用率比較高。 Cpu密集型:cpu佔用率高,IO佔用率低。
IO密集型更適合做併發處理。IO執行速度慢
6. 併發的三個層次
低階:作業系統層面實現併發,一般是針對於一門語言的庫編寫,不是給程式設計師用,python不支援 中階:幾乎所有語言都支援中階併發。 高階:第三方模組執行併發操作。
7. 執行緒和程序
程式:程式可以看成一些列的指令集。靜態的。 程序:當程式執行起來之後,建立一個(也可以是多個)程序。 執行緒:程序的基本執行單元,一個程序至少要一個執行緒。 程序可以看成是任務,比如灑水,掃地 執行緒就是基本的執行單元,執行任務的人。
一個執行緒只能屬於一個程序
關於程序獨立,執行緒共享的問題(重要): 程序具有獨立的空間和系統資源,執行緒沒有獨立的系統資源,處於同一個程序下的執行緒共享該程序下的資源。 一定要避免多執行緒(同一個程序下)資源出現的併發修改問題————————執行緒不安全。
8. 多執行緒
【同時】:併發
多程序:多個任務同時執行 多執行緒:在同一個任務中,多個執行緒同時執行 處理:單核cpu處理IO密集型才有效果
多執行緒的缺點: (1)執行緒也是程式,也需要佔用記憶體,設定的執行緒越多,佔用記憶體就越多。 (2)多執行緒需要協調管理,需要cpu時間跟蹤,cpu也會被佔用一部分。 (3)最重要:多執行緒的共享資源不安全。導致資料不一致。