目錄
- 一.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 塊);
- 消費者:吃煮熟的肉片,沒吃一片,肉片數量減一,吃完為止;
# !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
import time
# 創建條件變數 condition
con = threading.Condition()
meat_num = 0
def thread_consumers(): # 條件變數 condition 執行緒上鎖
con.acquire()
# 全域變數宣告關鍵字 global
global meat_num
meat_num = 0
# 等待肉片下鍋煮熟
con.wait()
while True:
print("我來一塊肉片...")
meat_num -= 1
print("剩余肉片數量:%d"%meat_num)
time.sleep(0.5)
if meat_num == 0:
# 肉片吃光了,通知老板添加肉片
print("老板,再來一份老肉片...")
con.notify()
# 肉片吃光了,等待肉片
con.wait()
# 條件變數 condition 執行緒釋放鎖
con.release()
def thread_producer(): # 條件變數 condition 執行緒上鎖
con.acquire() # 全域變數宣告關鍵字 global
global meat_num
# 肉片熟了,可以開始吃了
meat_num = 10
print("肉片熟了,可以開始吃了...")
con.notify()
while True:
# 阻塞函式,等待肉片吃完的通知
con.wait()
meat_num = 10
# 添加肉片完成,可以繼續開吃
print("添加肉片成功!當前肉片數量:%d"%meat_num)
time.sleep(1)
con.notify()
con.release()
if **name** == "**main**": # 創建并初始化執行緒
t1 = threading.Thread(target=thread_producer)
t2 = threading.Thread(target=thread_consumers)
# 啟動執行緒 -- 注意執行緒啟動順序,啟動順序很重要
t2.start()
t1.start()
# 阻塞主執行緒,等待子執行緒結束
t1.join()
t2.join()
print("程式結束!")
'''
輸出結果:
肉片熟了,可以開始吃了...
我來一塊肉片...
剩余肉片數量:9
我來一塊肉片...
剩余肉片數量:8
我來一塊肉片...
剩余肉片數量:7
我來一塊肉片...
剩余肉片數量:6
我來一塊肉片...
剩余肉片數量:5
我來一塊肉片...
剩余肉片數量:4
我來一塊肉片...
剩余肉片數量:3
我來一塊肉片...
剩余肉片數量:2
我來一塊肉片...
剩余肉片數量:1
我來一塊肉片...
剩余肉片數量:0
老板,再來一份老肉片...
添加肉片成功!當前肉片數量:10
我來一塊肉片...
剩余肉片數量:9
我來一塊肉片...
剩余肉片數量:8
我來一塊肉片...
剩余肉片數量:7
.............
'''
注意:
- 1.全域變數要宣告關鍵字 global;
- 2.注意執行緒的啟動順序,這個很重要;
四.Python 執行緒條件變數 Condition 總結
注意執行緒互斥鎖 Lock / 執行緒事件 Event / 執行緒條件變數 Condition 三者的區別,場景不同,使用方式也不同,前兩者一般可以作為簡單的執行緒互動,執行緒條件變數 Condition 可以用于比較復雜的執行緒互動
五.猜你喜歡
- Python 條件推導式
- Python 串列推導式
- Python 字典推導式
- Python 函式宣告和呼叫
- Python 不定長引數 *argc/**kargcs
- Python 匿名函式 lambda
- Python return 邏輯判斷運算式
- Python 字串/串列/元組/字典之間的相互轉換
- Python 區域變數和全域變數
- Python type 函式和 isinstance 函式區別
- Python is 和 == 區別
- Python 可變資料型別和不可變資料型別
- Python 淺拷貝和深拷貝
- Python 檔案讀寫操作
- Python 例外處理
- Python 模塊 import
- Python __name__ == ‘__main__’詳細解釋
未經允許不得轉載:猿說編程 ? Python 執行緒條件變數 Condition
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288355.html
標籤:Python
上一篇:Python 執行緒事件 Event - Python零基礎入門教程
下一篇:pycharm代碼洗掉恢復
