WaitingOnCondition詳解

一、什麼是WaitingOnCondition

WaitingOnCondition是Python Thread模塊中的一個機制,它提供了一種讓線程暫停和恢復執行的方法。它的基本原理是:線程在執行的時候,判斷某個條件是否滿足,如果條件不滿足,就停止執行,等待某個事件的發生,直到事件發生之後,線程才會繼續執行下去。

我們通常使用多線程的目的是為了提高程序的執行效率和吞吐量,但有時候我們需要控制線程的執行順序和執行依賴關係,必須要等待某個條件滿足之後才能繼續執行,這時我們就需要用到WaitingOnCondition。

二、WaitingOnCondition的核心方法

WaitingOnCondition有兩個核心方法:wait()和notify()。

1. wait()

wait()用來讓線程在等待某個條件滿足的時候暫停執行,並且釋放持有的鎖,讓其他線程有機會獲得鎖並修改線程等待的條件。如果等待的條件不滿足,線程會進入等待狀態,並一直等待到其它線程調用notify()方法來通知它條件已經發生了變化,或者設置timeout參數,如果超過指定的時間還沒有被喚醒,就會自動喚醒。

2. notify()

notify()用來喚醒等待在某個條件上的線程,通知它條件已經發生了變化。如果有多個線程在同一個條件上等待,notify()只能喚醒其中一個線程(不保證喚醒哪個),而notifyAll()方法則會喚醒所有等待在該條件上的線程。

三、WaitingOnCondition的使用示例

下面是一個非常簡單的使用WaitingOnCondition機制的例子。

# 導入線程模塊
import threading

# 創建鎖
lock = threading.Lock()

# 創建條件
condition = threading.Condition(lock)

def func_1():
    with lock:
        print("func_1獲得了鎖")
        condition.wait()
        print("func_1被喚醒了")

def func_2():
    with lock:
        print("func_2獲得了鎖")
        condition.notify()
        print("func_2發送了通知")

# 創建線程
t1 = threading.Thread(target=func_1)
t2 = threading.Thread(target=func_2)

# 啟動線程
t1.start()
t2.start()

# 等待線程結束
t1.join()
t2.join()

在這個例子中,我們創建了一個鎖和一個條件,然後創建了兩個線程,分別是func_1和func_2,線程func_1在執行過程中調用了condition.wait()方法,進入了等待狀態,並釋放了持有的鎖。線程func_2在執行過程中調用了condition.notify()方法,通知func_1線程等待的條件已經發生了變化。

這個例子非常簡單,只是說明了使用WaitingOnCondition機制的基本方法。實際上,在實際應用中,WaitingOnCondition機制還可以結合多線程的等待隊列、超時等待等功能來使用,從而實現更加複雜的線程交互和協同的邏輯。完整代碼可以參考以下示例:

# 導入線程模塊
import threading
import time

# 創建鎖
lock = threading.Lock()

# 創建條件
condition = threading.Condition(lock)

# 等待隊列
wait_queue = []

def producer():
    i = 0
    while i < 5:
        with lock:
            print("producer獲得了鎖")
            wait_queue.append(i)
            condition.notify()
            print("producer發送了通知")
            i += 1
            time.sleep(1)

def consumer():
    while True:
        with lock:
            print("consumer獲得了鎖")
            while len(wait_queue) == 0:
                print("consumer沒有等待隊列")
                condition.wait(timeout=5)
                print("consumer等待結束")
            item = wait_queue.pop(0)
            print("consumer獲取了%d" % item)

# 創建線程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)

# 啟動線程
t1.start()
t2.start()

# 等待線程結束
t1.join()
t2.join()

在這個例子中,我們創建了一個生產者線程和一個消費者線程。生產者線程會把數字0~4依次加入到等待隊列中,並且每次加入一個數字後,都會調用condition.notify()方法通知消費者線程等待隊列已經增加了一個元素。消費者線程會不斷的從等待隊列中獲取元素,並處理。

在消費者線程的執行過程中,如果等待隊列為空,它會調用condition.wait(timeout=5)方法,等待5秒,如果還沒有其它線程調用了notify()方法通知它,它就會自動被喚醒,並且繼續等待。這種機制在實際應用中非常常見,可以實現複雜的線程交互和協同的邏輯。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198550.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 10:25
下一篇 2024-12-04 10:26

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論