目錄
一、多任務
1.1定義
1.2具體體現
1.3并發和并行
1.3.1并發操作
1.3.2并行操作
1.3.3對比
二、進程
2.1概念
2.2特點
2.3進程狀態
2.4多進程
2.5多進程實現
2.6進程鎖
三、線程
3.1概念
3.2特點
3.3適用場景
3.4多線程實現
四、對比
4.1關系對?
4.2區別對?
4.3優缺點
一、多任務
1.1定義
1.2具體體現
多核處理器:真正并行執行多個任務,每個核心處理不同進程
CPU時間片輪轉:操作系統快速切換執行不同程序,給用戶同時運行多個程序的感覺
文檔編輯器實時保存文件同時進行拼寫檢查
瀏覽器同時加載多個網頁標簽
1.3并發和并行
多任務的兩種表現形式:并發和并行
1.3.1并發操作
指多個任務在同一時間段內交替執行,通過任務切換實現同時處理多個任務的效果。在單核CPU上也可以實現并發。
1.3.2并行操作
指多個任務真正同時執行,需要多個處理單元(如多核CPU)來實現,每個任務在不同的處理單元上同時運行。
1.3.3對比
二、進程
2.1概念
是計算機中正在運行的程序的一個實例,是操作系統進行資源分配和調度的基本單位。
2.2特點
獨立性:每個進程都有獨立的內存空間和系統資源
動態性:進程是程序的一次執行過程,具有生命周期
并發性:多個進程可以同時存在于系統中并并發執行
異步性:進程按各自獨立的、不可預知的速度向前推進
2.3進程狀態
2.4多進程
def fun_a():print('進行程序a')def fun_b():print('進行程序b')fun_a()
fun_b()
當我們需要執行上面代碼中的兩個任務進程的時候,同時進行可以大大增加效率
現在的進程執行順序:
采用多進程:
2.5多進程實現
1.導入進程multiprocessing包
代碼實現:
# 導?多進程模塊,?于創建和管理進程
import multiprocessing
# 導?時間模塊,?于實現計時功能
import time
def music():for i in range(3):print('聽?樂...')time.sleep(0.2)
def coding():for i in range(3):print('敲代碼...')time.sleep(0.2)
if __name__ == '__main__':# 創建?個進程,?于執?名為music的函數music_process = multiprocessing.Process(target=music)# 創建另?個進程,?于執?名為coding的函數coding_process = multiprocessing.Process(target=coding)# 啟動music進程,使其開始執?music_process.start()# 啟動coding進程,使其開始執?coding_process.start()
由于是交替執行,無序,所以控制臺輸出的時候可能并不像我們想要的結果那樣一一交替運行,比如:
2.6進程鎖
我們可以通過進程鎖,來管理運行的權力,規定將運行的職權給一個功能后,進行堵塞,必須等待其運行完才能將運行的權利交給下一個功能
# 導?多進程模塊,?于創建和管理進程
from multiprocessing import Process, Lock
# 導?時間模塊,?于實現計時功能,導入進程鎖,將程序運行進行阻塞
lock = Lock()
import time
def music():for i in range(3):with lock:print('正在播放音樂...')time.sleep(0.2)
def coding():for i in range(3):with lock:print('敲代碼...')time.sleep(0.2)
if __name__ == '__main__':# 創建?個進程,?于執?名為music的函數music_process = Process(target=music)# 創建另?個進程,?于執?名為coding的函數coding_process = Process(target=coding)# 啟動music進程,使其開始執?music_process.start()# 啟動coding進程,使其開始執?coding_process.start()
此時多次運行測試發現,運行結果一致都是一一交替運行:
三、線程
3.1概念
線程(Thread)是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。一個進程可以包含多個線程,這些線程共享進程的內存空間和系統資源。?
3.2特點
1. 輕量級
--線程是比進程更小的執行單位
--創建和切換開銷比進程小得多
2. 共享資源
--同一進程內的線程共享內存空間、文件句柄等資源
--線程間通信比進程間通信更高效
3. 獨立執行
--每個線程有獨立的執行路徑
--擁有獨立的棧空間和寄存器狀態
4. 并發執行
--多個線程可以并發執行
--提高程序執行效率和響應性
5. 同步需求
--多線程訪問共享資源時需要同步機制
--需要考慮線程安全問題
?
3.3適用場景
1. I/O密集型任務
文件讀寫、網絡請求等I/O操作
當一個線程等待I/O時,其他線程可以繼續執行
2. 并行計算
CPU多核環境下可實現真正的并行處理
大量獨立計算任務的并行執行
3. 用戶界面應用
提高UI響應性,避免界面卡頓
后臺任務與UI線程分離
4. 服務器應用
處理多個客戶端并發請求
Web服務器、數據庫服務器等
5. 實時系統
需要同時處理多個實時任務的場景
定時任務、監控系統等
3.4多線程實現
# 導?time模塊和threading模塊
import time
import threading
# 定義?個播放?樂的函數
def music():# 循環三次,每次打印聽?樂的狀態并暫停0.2秒for i in range(3):print('聽?樂...')time.sleep(0.2)
# 定義?個編碼的函數
def coding():# 循環三次,每次打印敲代碼的狀態并暫停0.2秒for i in range(3):print('敲代碼...')time.sleep(0.2)
# 程序??
if __name__ == '__main__':# 創建?個線程,?于播放?樂。通過threading.Thread類創建線程,music函數作為線程# 要執?的?標。music_thread = threading.Thread(target=music)# 創建?個線程,?于編碼?作。同樣使?threading.Thread類創建,coding函數作為線# 程序要執?的?標。coding_thread = threading.Thread(target=coding)# 啟動?樂線程和編碼線程music_thread.start()coding_thread.start()# 等待?樂線程完成其任務music_thread.join()# 等待編碼線程完成其任務coding_thread.join()print('程序結束')
四、對比
4.1關系對?
① 線程是依附在進程??的,沒有進程就沒有線程。
② ?個進程默認提供?條線程,進程可以創建多個線程
4.2區別對?
① 進程之間不共享全局變量
② 線程之間共享全局變量
③ 創建進程的資源開銷要?創建線程的資源開銷要?
④ 進程是操作系統資源分配的基本單位,線程是CPU調度的基本單位
4.3優缺點
① 進程優缺點:
優點:可以?多核
缺點:資源開銷?
② 線程優缺點
優點:資源開銷?
缺點:不能使?多核