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