一、什麼是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-hk/n/198550.html
微信掃一掃
支付寶掃一掃