python27-條件同步變量

上一篇文章講述的互斥鎖是簡單的線程同步機(jī)制,但對于復(fù)雜線程同步問題的支持無法很好的滿足。因此本篇文章引入條件同步變量肥照。Condition除了能提供RLock()和Lock()的方法外,還提供了 wait()秋麸、notify()袖外、notifyAll()方法循头。希望感興趣的小伙伴可以堅持看下去同時歡迎提出寶貴的意見讓我們一起進(jìn)步唠摹!

01:條件同步變量(Condition)

1)概述:在滿足了特定的條件后,線程才可以訪問相關(guān)的數(shù)據(jù)爆捞。

2)原理:線程首先acquire一個條件變量,然后判斷一些條件。如果條件不滿足則wait ; 如果條件滿足,進(jìn)行一些處理改變條件后通過notify方法通知其他線程 ; 其他處于wait狀態(tài)線程接到通知后會重新判斷條件

3)調(diào)用方式:cond =threading.Condition(Lock/RLock);不傳默認(rèn)RLock

4)常用方法:

wait(timeout)線程掛起,等待直到收到一個notify通知或出現(xiàn)超時才會被喚醒繼續(xù)運(yùn)行勾拉。

notify(n):喚醒一個或多個等待此條件變量的線程煮甥。

notifyAll():喚醒所有等待此條件的線程

5)使用場景:生產(chǎn)者與消費(fèi)者問題,一個線程生產(chǎn)的數(shù)據(jù)提供給另外一個線程使用藕赞。

6)注意事項:

wait()成肘、notify()、notifyAll()方法必須在已獲得Lock前提下才能調(diào)用,否則會觸發(fā)RuntimeError斧蜕。

調(diào)用wait()會釋放Lock,直至該線程被Notify()双霍、NotifyAll()或者超時線程又重新獲得Lock。

③如果存在多個線程等待同一個條件,notify()操作會喚醒他們中的一個或多個(這種行為取決于底層的操作系統(tǒng))

notify()不會主動釋放Lock

02:案例操作
早點(diǎn)鋪的師傅必須蒸好包子,消費(fèi)者才能把包子買來吃掉批销。即:
生產(chǎn)者可以不斷生產(chǎn)商品直到倉庫裝滿然后告知消費(fèi)者消費(fèi);
消費(fèi)者也可以判斷倉庫是否滿從而告知生產(chǎn)者繼續(xù)生產(chǎn)商品洒闸。
import threading,time,random
lock_con=threading.Condition()#條件鎖對象
num_list=[]#創(chuàng)建一個空列表
def producer():
    global num_list#引用全局變量
    while True:#模擬不停的生產(chǎn)包子
        if lock_con.acquire():#上鎖
            num_list.append(1)
            print('生產(chǎn)者:','生產(chǎn)了一個包子',num_list)
            lock_con.notifyAll()#通知等待池激活所有線程
            lock_con.release()#解鎖
            time.sleep(random.randint(0,10)*0.1)#模擬包子端上桌的時間
def consumer():
    global num_list
    while True:#模擬不停的吃掉包子
        if lock_con.acquire():#上鎖
            if len(num_list)==0:
                print('包子已賣完,請等待包子生產(chǎn)中!!!')
                lock_con.wait()#線程釋放鎖進(jìn)入等待,被喚起重新加鎖
            num_list.remove(num_list[0])#去掉第一個元素
            print('消費(fèi)者:','吃掉了一個包子',num_list)
            time.sleep(random.randint(0,10)*0.2)#模擬吃掉包子的時間
            lock_con.notifyAll()
            lock_con.release()#解鎖
t1=threading.Thread(target=producer)
t2=threading.Thread(target=consumer)
t1.start()
t2.start()
t1.join()
t2.join()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市均芽,隨后出現(xiàn)的幾起案子丘逸,更是在濱河造成了極大的恐慌,老刑警劉巖掀宋,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件深纲,死亡現(xiàn)場離奇詭異,居然都是意外死亡劲妙,警方通過查閱死者的電腦和手機(jī)湃鹊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是趴,“玉大人涛舍,你說我怎么就攤上這事∷敉荆” “怎么了富雅?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肛搬。 經(jīng)常有香客問我没佑,道長,這世上最難降的妖魔是什么温赔? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蛤奢,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啤贩。我一直安慰自己待秃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布痹屹。 她就那樣靜靜地躺著章郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪志衍。 梳的紋絲不亂的頭發(fā)上暖庄,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音楼肪,去河邊找鬼培廓。 笑死,一個胖子當(dāng)著我的面吹牛春叫,可吹牛的內(nèi)容都是我干的肩钠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼象缀,長吁一口氣:“原來是場噩夢啊……” “哼蔬将!你這毒婦竟也來了爷速?” 一聲冷哼從身側(cè)響起央星,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惫东,沒想到半個月后莉给,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廉沮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年颓遏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞时。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡叁幢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坪稽,到底是詐尸還是另有隱情曼玩,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布窒百,位于F島的核電站黍判,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篙梢。R本人自食惡果不足惜顷帖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贬墩,春花似錦榴嗅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挖函,卻和暖如春磷仰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颁井。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工厅贪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雅宾。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓养涮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眉抬。 傳聞我的和親對象是個殘疾皇子贯吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容