多程序和多執行緒程式設計操作
1.什麼是程序
程序是系統最小的資源管理單元,是一個程式在一個數據集上的一次動態執行過程。
2.什麼是執行緒
執行緒是計算機程式執行的實際執行者,是cpu的執行單元,在計算機中,程序主要是為了執行緒的執行進行分配資源操作,程式真正的執行者是執行緒,每一個程序至少有一個執行緒用於執行程式。一個程序可以有多個執行緒,而一個執行緒只服務於一個程序。
3.程式執行方法
- 序列 按照一定的步驟執行每個環節
- 並行 同時執行接收到的多個任務
- 併發 同時接受多個任務,同時執行多個任務,但是在某一時刻只執行一個在很短時間內多工切換。
4.多執行緒程式設計
在python裡一共內建了兩種多執行緒模組,_thread和threading模組,其中對於python3.x的使用者來說,最好使用threading模組。
-
_thread模組
常用的有下列方法:
_thread.get_ident() | 獲取當前執行緒 |
_thread.start_new_thread() | 建立一個新執行緒 |
-
threading模組
threading.Thread | 建立及管理執行緒 |
---|---|
threading.Event | 事件類,用於執行緒同步 |
threading.Condition | 條件類,用於執行緒同步 |
threading.Lock/RLock | 鎖類,用於執行緒同步 |
threading.Timer | 延時執行緒 |
threading.active_count() | 獲取當前alive的執行緒數量 |
threading.current_thread() | 獲取當前正在執行的物件 |
threading.get_ident() | 獲取當前執行緒的編號及名稱 |
threading.envmerate() | 獲取當前alive的執行緒列表 |
threading.main_thread() | 獲取主執行緒資訊 |
1.Thread模組
Thread模組下的方法
__init__(group,target,name,args,kwargs) 建立程序,括號內是建立程序的一些屬性 is_alive 判斷程序的alive狀態 run() 執行執行緒的方法(最好不直接使用) start() 執行緒啟動方法 join([timeout=None]) 執行緒獨佔,線上程執行完之前或者超時之後阻塞程序 ident 當前執行緒的唯一編號 name 當前執行緒的名稱 daemon 判斷是否是守護執行緒 2.current_thread
current_thread模組下的方法
get_name() | 當前執行緒名稱 |
3.Lock/RLock模組(互斥鎖/可重用鎖)
模組下的方法
acquire() | 上鎖 |
release() | 解鎖 |
4.Dead Lock(死鎖)
當cpu進行併發時間片切換操作時恰好遇到了重複上鎖的情況,於是程式就會被鎖死,不再執行結束
5.Condition模組
acquire() | 上鎖 |
release() | 解鎖 |
wait() | 解鎖,同時阻塞當前程序,等待被程序喚醒 |
wait_for() | 解鎖,同時阻塞當前執行緒,等待被特定程序喚醒 |
notify() | 喚醒 |
notify_all() | 喚醒所有等待的執行緒 |
6.Event模組
set() | 新增標記 |
wait() | 等待 |
clear() | 清除標記 |
-
queue模組(佇列)
queue.Queue().put( , [timeout=None]) 向佇列中新增,直到佇列滿或者超時
queue.Queue().get( , [timeout=None]) 從佇列中取出,直到佇列為空或者超時
5.多程序程式設計
-
multiprocessing模組
Process | 程序型別,用於建立程序和管理程序 |
Lock/RLock | 互斥鎖\重用鎖, 用於程序同步 |
Event | 事件型別,用於程序同步 |
Condition | 條件型別,用於程序同步 |
Queue | 佇列型別 |
Manager | 程序管理型別 |
Listener | Client | 程序監聽\客戶端 |
- os模組
os.getpid() 展示當前程序編號
os.getppid() 展示當前父程序編號
- 面向物件的多執行緒的操作
- 引入需要的模組
- 定義型別
- 繼承父類(multiprocessing.Process)
- 初始化 ------>可以新增引數
- 重寫run()方法
- 建立並啟動程序
- 多程序對變數的處理
全域性變數經過多個程序處理後,並不會發生變化,因為程序在執行時,會把需要的資料複製一份,然後再進行操作。
- pool程序池
apply(func,args) | 傳遞引數args並執行函式func,同時阻塞程序池,直到當前函式執行完成 |
apply_async(func,args,callback,error_callback) | 這種方法不會阻塞程序池 |
close() | 主動停止向程序池中提交任務 |
terminate() | 主動結束該程序,當程序池物件被回收時自動呼叫 |
join() | 等待工作程序退出,獨佔 |
- 多程序通訊 multiprocessing.Manager
Array | 程序間共享陣列型別 |
Queue | 程序間共享佇列型別 |
list() | 程序間共享列表型別 |
dict() | 程序間共享字典型別 |
Value | 程序間共享值型別 |
Barrier | |
BoundedSemaPhorel | SemaPhore |
程序訊號量型別 |
Lock | RLock | 程序互斥鎖 | 重用鎖 |
Event | 同步事件型別 |
Condition | 同步條件型別 |
- 多程序通訊 multiprocessing.Queue
put(data, [ , timeout=None]) | 新增一個數據 |
put_nowait(data) | 非阻塞模式 |
get([timeout=None]) | 獲得一個數據 |
get_nowait() | 非阻塞模式 |
full() | 判斷佇列已滿 |
empty() | 判斷佇列已空 |
close() | 關閉 |
qsize() | 獲取佇列中元素數量 |
- 多程序通訊 multiprocessing.Pipe
multiprocessing.Pipe.send(data) 傳送訊息
multiprocessing.Pipe.recv() 接收訊息