1. 程式人生 > >day 33 執行緒學習之執行緒程序效率對比. 鎖. 訊號量 . 事件

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。