1. 程式人生 > >多程序和多執行緒程式設計操作

多程序和多執行緒程式設計操作

1.什麼是程序

程序是系統最小的資源管理單元,是一個程式在一個數據集上的一次動態執行過程。

2.什麼是執行緒

執行緒是計算機程式執行的實際執行者,是cpu的執行單元,在計算機中,程序主要是為了執行緒的執行進行分配資源操作,程式真正的執行者是執行緒,每一個程序至少有一個執行緒用於執行程式。一個程序可以有多個執行緒,而一個執行緒只服務於一個程序。

3.程式執行方法

  • 序列   按照一定的步驟執行每個環節
  • 並行   同時執行接收到的多個任務
  • 併發   同時接受多個任務,同時執行多個任務,但是在某一時刻只執行一個在很短時間內多工切換。

4.多執行緒程式設計

在python裡一共內建了兩種多執行緒模組,_thread和threading模組,其中對於python3.x的使用者來說,最好使用threading模組。

  • _thread模組     

常用的有下列方法:

_thread.get_ident()      獲取當前執行緒
_thread.start_new_thread() 建立一個新執行緒
  • threading模組

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模組

multiprocessing模組中常用屬性和方法
Process 程序型別,用於建立程序和管理程序
Lock/RLock 互斥鎖\重用鎖, 用於程序同步
Event 事件型別,用於程序同步
Condition 條件型別,用於程序同步
Queue 佇列型別
Manager 程序管理型別
Listener | Client 程序監聽\客戶端
  • os模組

os.getpid()  展示當前程序編號

os.getppid()   展示當前父程序編號

  • 面向物件的多執行緒的操作
  1.  引入需要的模組
  2. 定義型別
  3. 繼承父類(multiprocessing.Process)
  4. 初始化 ------>可以新增引數
  5. 重寫run()方法
  6. 建立並啟動程序
  • 多程序對變數的處理

全域性變數經過多個程序處理後,並不會發生變化,因為程序在執行時,會把需要的資料複製一份,然後再進行操作。

  • 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()     接收訊息