python筆記11-多線程之Condition(條件變數)

來源:互聯網
上載者:User

標籤:ons   port   threading   CQ   span   run   star   div   喚醒   

前言

當小夥伴a在往火鍋裡面添加魚丸,這個就是生產者行為;另外一個小夥伴b在吃掉魚丸就是消費者行為。當火鍋裡面魚丸達到一定數量加滿後b才能吃,這就是一種條件判斷了。
這就是本篇要講的Condition(條件變數)

Condition

Condition(條件變數)通常與一個鎖關聯。需要在多個Contidion中共用一個鎖時,可以傳遞一個Lock/RLock執行個體給構造方法,否則它將自己產生一個RLock執行個體。

可以認為,除了Lock帶有的鎖定池外,Condition還包含一個等待池,池中的線程處於狀態圖中的等待阻塞狀態,直到另一個線程調用notify()/notifyAll()通知;得到通知後線程進入鎖定池等待鎖定。

Condition():

  • acquire(): 線程鎖
  • release(): 釋放鎖
  • wait(timeout): 線程掛起,直到收到一個notify通知或者逾時(可選的,浮點數,單位是秒s)才會被喚醒繼續運行。wait()必須在已獲得Lock前提下才能調用,否則會觸發RuntimeError。
  • notify(n=1): 通知其他線程,那些掛起的線程接到這個通知之後會開始運行,預設是通知一個正等待該condition的線程,最多則喚醒n個等待的線程。notify()必須在已獲得Lock前提下才能調用,否則會觸發RuntimeError。notify()不會主動釋放Lock。
  • notifyAll(): 如果wait狀態線程比較多,notifyAll的作用就是通知所有線程
生產者與消費者

實現情境:當a同學王火鍋裡面添加魚丸加滿後(最多5個,加滿後通知b去吃掉),通知b同學去吃掉魚丸(吃到0的時候通知a同學繼續添加)

# coding=utf-8import threadingimport timecon = threading.Condition()num = 0# 生產者class Producer(threading.Thread):    def __init__(self):        threading.Thread.__init__(self)    def run(self):        # 鎖定線程        global num        con.acquire()        while True:            print "開始添加!!!"            num += 1            print "火鍋裡面魚丸個數:%s" % str(num)            time.sleep(1)            if num >= 5:                print "火鍋裡面裡面魚丸數量已經到達5個,無法添加了!"                # 喚醒等待的線程                con.notify()  # 喚醒小夥伴開吃啦                # 等待通知                con.wait()        # 釋放鎖        con.release()# 消費者class Consumers(threading.Thread):    def __init__(self):        threading.Thread.__init__(self)    def run(self):        con.acquire()        global num        while True:            print "開始吃啦!!!"            num -= 1            print "火鍋裡面剩餘魚丸數量:%s" %str(num)            time.sleep(2)            if num <= 0:                print "鍋底沒貨了,趕緊加魚丸吧!"                con.notify()  # 喚醒其它線程                # 等待通知                con.wait()        con.release()p = Producer()c = Consumers()p.start()c.start()

 

運行結果:
開始添加!!!
火鍋裡面魚丸個數:1
開始添加!!!
火鍋裡面魚丸個數:2
開始添加!!!
火鍋裡面魚丸個數:3
開始添加!!!
火鍋裡面魚丸個數:4
開始添加!!!
火鍋裡面魚丸個數:5
火鍋裡面裡面魚丸數量已經到達5個,無法添加了!
開始吃啦!!!
火鍋裡面剩餘魚丸數量:4
開始吃啦!!!
火鍋裡面剩餘魚丸數量:3
開始吃啦!!!
火鍋裡面剩餘魚丸數量:2
開始吃啦!!!
火鍋裡面剩餘魚丸數量:1
開始吃啦!!!
火鍋裡面剩餘魚丸數量:0
鍋底沒貨了,趕緊加魚丸吧!
開始添加!!!
火鍋裡面魚丸個數:1
開始添加!!!
火鍋裡面魚丸個數:2
開始添加!!!
火鍋裡面魚丸個數:3
開始添加!!!
火鍋裡面魚丸個數:4
開始添加!!!
火鍋裡面魚丸個數:5

python筆記11-多線程之Condition(條件變數)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.