相關概念
并行
并行是指同一個時刻,多個任務同時進行。只有在多核CPU下才會發生。
并發
并發是指單個CPU在不同任務之間來換切換工作,但是同一時刻只有一個任務在工作。由于CPU的切換速度很快,給人的感受是多個任務在一起運行。
串行
串行是指單個CPU根據任務隊列順序執行任務,只有前面的任務完成后才會執行后面的任務。
進程
進程是程序在計算機中運行的具體實現。進程一般由程序段
,數據集
和控制塊
組成。
- 程序段是指任務的指令集
- 數據集是指任務執行過程中需要的變量,函數,類等數據
- 控制塊是記錄CPU處理任務時用到的控制模塊
在操作系統中進程使用pid(process identification)表示。pid由進程創建時,操作系統分配得到。并且在進程運行過程中pid不會發生改變。
import os?# 獲取當前進程的pidprint(os.getpid())# 獲取當前進程的父進程pidprint(os.getppid())
線程
進程內的一個任務執行的獨立單元,是任務調度和系統執行的最小單位。
協程
用戶態的輕量級線程,協程的調度完全由用戶控制,主要為單線程下模擬多線程。
一個程序可以由一到多個進程,一個進程可以有一到多個線程,一個線程下可以有一到多個協程。
進程狀態
在操作系統創建進程,到銷毀進程的過程中,進程一般存在三個狀態就緒
,運行
,阻塞
- 就緒:進程獲取了除CPU外的及其資源,一旦獲取CPU資源就可以工作的狀態
- 運行:CPU在工作,且進程工作的狀態
- 阻塞:CPU沒有工作,且進程工作的狀態,往往是在執行IO操作
同步/異步
同步和異步是多任務處理過程中的不同方式或手段。
同步
同步就是多任務發生時,系統按照任務順序依次執行,只有前面的任務結束后,才會執行后面的任務。
異步
異步就是多任務發生時,系統會以并行或并發的方式處理多任務,讓多任務之間不必相關等待。
案例說明
同步:某人去商場購買洗衣機然后回家做飯。她必須要等商場配好洗衣機后,然后帶著洗衣機,回家做飯。
異步:某人去商場相中洗衣機后,網上下單,然后回家做飯。此時她不需要等待商場配好洗衣機后才回家,網上下單后就可以直接回家了。
阻塞/非阻塞
阻塞和非阻塞是進程處于阻塞狀態時,CPU的工作方式。
阻塞
當任務處于阻塞時,CPU處于等待狀態,不能處理其他任務。
非阻塞
當任務處于阻塞時,CPU不必等待,能夠處理其他任務。
同步阻塞
當系統以同步方式處理多任務時,如果任務A發生了阻塞狀態,則任務A后面的所有任務都必須要等待任務A結束阻塞狀態,且完成后才能執行。
import time??def taska():print("task a started")time.sleep(5)print("task a ended")??def taskb():print("task b started")time.sleep(5)print("task b ended")??if __name__ == "__main__":queue = [taska, taskb]for task in queue:task()
異步阻塞
當系統以異步方式處理多任務時,如果任務A發生阻塞狀態,系統需要等待,而不會切換至其他任務進行處理。
"""@Time: 2024/6/28 20:18@Author: 'Ethan'@Email: ethanzhou4406@outlook.com@File: 1. 同步阻塞.py@Project: python@Feature:"""import timeimport multiprocessing??def taska():print("task a started")time.sleep(5)print("task a ended")??def taskb():print("task b started")time.sleep(5)print("task b ended")?def taskc():print("task c started")time.sleep(5)print("task c ended")?if __name__ == "__main__":processa = multiprocessing.Process(target=taska)processb = multiprocessing.Process(target=taskb)processc = multiprocessing.Process(target=taskc)queue = [processa, processb, processc]for process in queue:process.start()process.join() # 阻塞?
同步非阻塞
當系統以同步方式處理多任務時,如果前面的任務A出現阻塞狀態,則后面的任務B不必等待,直接運行。
異步非阻塞
當系統以異步方式處理多任務時,如果前面的任務A出現阻塞狀態,則不需等待切換至任務B運行。
"""@Time: 2024/6/28 20:18@Author: 'Ethan'@Email: ethanzhou4406@outlook.com@File: 1. 同步阻塞.py@Project: python@Feature:"""import timeimport multiprocessing??def taska():print("task a started")time.sleep(5)print("task a ended")??def taskb():print("task b started")time.sleep(5)print("task b ended")?def taskc():print("task c started")time.sleep(5)print("task c ended")?if __name__ == "__main__":processa = multiprocessing.Process(target=taska)processb = multiprocessing.Process(target=taskb)processc = multiprocessing.Process(target=taskc)queue = [processa, processb, processc]for process in queue:process.start()
發布于 2024-06-28 21:30?IP 屬地江蘇