Python 线程条件变量 Condition - Python零基础入门教程
目錄
- 一.Python 線程條件變量 Condition 函數(shù)
- 二.Python 線程條件變量 Condition 原理
- 三.Python 線程條件變量 Condition 使用
- 四.Python 線程條件變量 Condition 總結(jié)
- 五.猜你喜歡
零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門
對(duì)于線程與線程之間的交互我們?cè)谇懊娴奈恼乱呀?jīng)介紹了 Python 互斥鎖 Lock / Python 事件 Event , 今天繼續(xù)介紹一種線程交互方式 – 線程條件變量 Condition;
一.Python 線程條件變量 Condition 函數(shù)
- acquire — 線程鎖,注意線程條件變量 Condition 中的所有相關(guān)函數(shù)使用必須在acquire / release 內(nèi)部操作;
- release — 釋放鎖,注意線程條件變量 Condition 中的所有相關(guān)函數(shù)使用必須在acquire / release 內(nèi)部操作;
- **wait( timeout ) **— 線程掛起(阻塞狀態(tài)),直到收到一個(gè) notify 通知或者超時(shí)才會(huì)被喚醒繼續(xù)運(yùn)行(超時(shí)參數(shù)默認(rèn)不設(shè)置,可選填,類型是浮點(diǎn)數(shù),單位是秒)。wait 必須在已獲得 Lock 前提下才能調(diào)用,否則會(huì)觸發(fā) RuntimeError;
- **notify(n=1) **— 通知其他線程,那些掛起的線程接到這個(gè)通知之后會(huì)開始運(yùn)行,缺省參數(shù),默認(rèn)是通知一個(gè)正等待通知的線程,最多則喚醒 n 個(gè)等待的線程。 notify 必須在已獲得 Lock 前提下才能調(diào)用,否則會(huì)觸發(fā) RuntimeError ,notify 不會(huì)主動(dòng)釋放 Lock ;
- notifyAll — 如果 wait 狀態(tài)線程比較多,notifyAll 的作用就是通知所有線程;
?
二.Python 線程條件變量 Condition 原理
Python 互斥鎖 Lock,主要作用是并行訪問共享資源時(shí),保護(hù)共享資源,防止出現(xiàn)臟數(shù)據(jù)。
Python 條件變量 Condition 也需要關(guān)聯(lián)互斥鎖,同時(shí) Condition 自身提供了 wait / notify / notifyAll 方法,用于阻塞 / 通知其他并行線程,可以訪問共享資源了。
可以這么理解,Condition 提供了一種多線程通信機(jī)制,假如線程 1 需要數(shù)據(jù),那么線程 1 就阻塞等待,這時(shí)線程 2 就去制造數(shù)據(jù),線程 2 制造好數(shù)據(jù)后,通知線程 1 可以去取數(shù)據(jù)了,然后線程 1 去獲取數(shù)據(jù)。
三.Python 線程條件變量 Condition 使用
案例一:成語接龍
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個(gè)人博客地址): www.codersrc.com @File:Python 線程條件變量 Condition.py @Time:2021/05/04 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!"""# 導(dǎo)入線程模塊 import threading# 創(chuàng)建條件變量condition con = threading.Condition()def thread_one(name):# 條件變量condition 線程上鎖con.acquire()print("{}:成語接龍準(zhǔn)備好了嗎".format(name))# 喚醒正在等待(wait)的線程con.notify()# 等待對(duì)方回應(yīng)消息,使用wait阻塞線程,等待對(duì)方通過notify喚醒本線程con.wait()print("{}:一干二凈".format(name))# 喚醒對(duì)方con.notify()# 等待消息答應(yīng)con.wait()print("{}:一天就知道看抖音美女,給你來個(gè)簡(jiǎn)單點(diǎn)的,來了:毛手毛腳".format(name))# 喚醒對(duì)方con.notify()# 等待消息答應(yīng)con.wait()print("{}:喲喲喲,不錯(cuò)不錯(cuò)!".format(name))# 喚醒對(duì)方con.notify()# 條件變量condition 線程釋放鎖con.release()def thread_two(name):# 條件變量condition 線程上鎖con.acquire()# wait阻塞狀態(tài),等待其他線程通過notify喚醒本線程con.wait()print("{}:準(zhǔn)備好了~開始吧!".format(name))# 喚醒對(duì)方con.notify()# 等待消息答應(yīng)con.wait()print("{}:凈你妹啊,沒法接...來個(gè)簡(jiǎn)單點(diǎn)的...".format(name))# 喚醒對(duì)方con.notify()# 等待消息答應(yīng)con.wait()print("{}:嘿,這個(gè)我知道:腳踏實(shí)地".format(name))# 喚醒對(duì)方con.notify()con.release()if __name__ == "__main__":# 創(chuàng)建并初始化線程t1 = threading.Thread(target=thread_one,args=("A"))t2 = threading.Thread(target=thread_two,args=("B"))# 啟動(dòng)線程 -- 注意線程啟動(dòng)順序,啟動(dòng)順序很重要t2.start()t1.start()# 阻塞主線程,等待子線程結(jié)束t1.join()t2.join()print("程序結(jié)束!")''' 輸出結(jié)果:A:成語接龍準(zhǔn)備好了嗎 B:準(zhǔn)備好了~開始吧! A:一干二凈 B:凈你妹啊,沒法接...來個(gè)簡(jiǎn)單點(diǎn)的... A:一天就知道看抖音美女,給你來個(gè)簡(jiǎn)單點(diǎn)的,來了:毛手毛腳 B:嘿,這個(gè)我知道:腳踏實(shí)地 A:喲喲喲,不錯(cuò)不錯(cuò)! 程序結(jié)束! '''案例二:生產(chǎn)者與消費(fèi)者模式,以吃火鍋為例:一盤老肉片有 10 塊肉,吃完了又重新往鍋里加….
- 生產(chǎn)者:往鍋里加老肉片,每次加一盤(10 塊);
- 消費(fèi)者:吃煮熟的肉片,沒吃一片,肉片數(shù)量減一,吃完為止;
注意:
- 1.全局變量要聲明關(guān)鍵字 global;
- 2.注意線程的啟動(dòng)順序,這個(gè)很重要;
四.Python 線程條件變量 Condition 總結(jié)
注意線程互斥鎖 Lock / 線程事件 Event / 線程條件變量 Condition 三者的區(qū)別,場(chǎng)景不同,使用方式也不同,前兩者一般可以作為簡(jiǎn)單的線程交互,線程條件變量 Condition 可以用于比較復(fù)雜的線程交互
五.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 線程條件變量 Condition
總結(jié)
以上是生活随笔為你收集整理的Python 线程条件变量 Condition - Python零基础入门教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BugkuCTF-MISC题telnet
- 下一篇: BugkuCTF-Reverse题lov