日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 线程条件变量 Condition - Python零基础入门教程

發布時間:2024/9/27 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 塊);
  • 消費者:吃煮熟的肉片,沒吃一片,肉片數量減一,吃完為止;
# !usr/bin/env python # -_- coding:utf-8 \__-"""@Author:猿說編程@Blog(個人博客地址): www.codersrc.com@File:Python 線程條件變量 Condition.py@Time:2021/05/04 07:37@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!"""# 導入線程模塊import threadingimport time# 創建條件變量 conditioncon = threading.Condition()meat_num = 0def thread_consumers():# 條件變量 condition 線程上鎖con.acquire()# 全局變量聲明關鍵字 globalglobal meat_nummeat_num = 0# 等待肉片下鍋煮熟con.wait()while True:print("我來一塊肉片...")meat_num -= 1print("剩余肉片數量:%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()# 全局變量聲明關鍵字 globalglobal meat_num# 肉片熟了,可以開始吃了meat_num = 10print("肉片熟了,可以開始吃了...")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

    總結

    以上是生活随笔為你收集整理的Python 线程条件变量 Condition - Python零基础入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。