day 33 執行緒學習之執行緒程序效率對比. 鎖. 訊號量 . 事件
一 . 執行緒
執行緒是cpu最小的執行單位,是能獨立執行的基本單位,程序是資源分配的最小單位。且:每個程序中最小有一個執行緒
執行緒與程序的區別:
1)地址空間和其它資源(如開啟檔案):程序間相互獨立,同一程序的各執行緒間共享。某程序內的執行緒在其它程序不可見。
2)通訊:程序間通訊IPC,執行緒間可以直接讀寫程序資料段(如全域性變數)來進行通訊——需要程序同步和互斥手段的輔助,以保證資料的一致性。(就類似程序中的鎖的作用) 3)排程和切換:執行緒上下文切換比程序上下文切換要快得多。 4)在多執行緒作業系統中(現在咱們用的系統基本都是多執行緒的作業系統),程序不是一個可執行的實體,真正去執行程式的不是程序,是執行緒,你可以理解程序就是一個執行緒的容器。執行緒的特點:(1)輕型實體(2)獨立排程和分派的基本單位 (3)共享程序資源(4)可併發執行
執行緒跟程序一樣,都是互相充滿 ‘敵意’ 的,彼此搶佔資源,彼此佔cpu。
二 . 執行緒的兩種建立方式
(1) from threading import Thread
def func( )
pass
t = Thread(target = func,args = ())
t.start()
(2) class MyThread(Thread):
def __init__(self,n):
super().__init()
self.n = n
def run(self):
pass
t = MyThead(12)
三 . 執行緒與程序效率的對比 ,join方法
執行緒比程序的效率要快很多,程序的執行還需要電腦的配置,cpu的執行速度,執行緒的話是不需要的,所以,開啟一個執行緒的時間是遠小於程序的。
四 . 同線程之間是資料共享的
同一程序與執行緒之間是資料共享的,多個執行緒之間有資料棧,資料不共享的,全域性變數在多個執行緒之間資料是
共享的,程序也一樣。
五 . 鎖(互斥鎖\同步鎖)
Look,解決資料共享時資料不安全的問題,但是同時犧牲了效率。
開始鎖:lock.acquire()
關閉鎖:lock.release() 只能有一個鎖
六 . 死鎖現象
雙方互相等待對方釋放對方手裡拿到的那個鎖
一樣的,也是隻能有一個鎖,你在用,別人就不能用,就跟上廁所是一樣的,別人在上這個廁所,你只能等。
七 . 遞迴鎖 :Rlock
A = B = Rlock 建立同等條件
同樣是互斥的,裡面存著個計數器,只有等鎖計數為0的時候,才能將鎖傳遞給下一位追夢者。
八 . 守護程序
執行緒的守護程序跟程序的守護程序不太一樣,
守護執行緒:主執行緒等著程序中所有非守護執行緒的結束,才算結束。
守護程序:主程序程式碼結束,守護程序也跟著結束。
九 . 訊號量:大寶劍原理
四個位置十個人,一次只能進去四個人,也就是每個程式碼的時間不同,進出的時間也不同,是不規律的,又快也有慢。
十 . 事件
e = Event
執行緒的事件跟程序的事件是一樣的
event.isSet():返回event的狀態值; event.wait():如果 event.isSet()==False將阻塞執行緒; event.set(): 設定event的狀態值為True,所有阻塞池的執行緒啟用進入就緒狀態, 等待作業系統排程; event.clear():恢復event的狀態值為False。