1. 程式人生 > >python中多執行緒中event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)

python中多執行緒中event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)

event是python中一個特有的標誌位方法,他一共有三種方法

1.event.wait():如果標誌位設定了,它不做任何事,如果沒有設定,則將會鎖住,等待標誌位的設定

2.event.set():設定標誌位

3.event.clear():清除標誌位

這一種機制很類似於java中的等待喚醒機制,我們可以試想一下,我們在一個執行緒中,不斷的設定和清除標誌位,在另一個執行緒中用wait()方法,當設定標誌位的時候另一個執行緒就會執行,當清除標誌位的時候,另一個執行緒就會停止,從而實現對一個執行緒的控制。

下面我們通過一個示例程式碼對其進行詳細的解釋:

#在這裡我們模仿一個紅綠燈的應用場景,綠燈亮的時候,車可以通過,紅燈亮的時候要等待。
import time
import threading

event = threading.Event()#首先要獲取一個event物件

def lighter():
    count = 0
    event.set() #先設定綠燈
    while True:
        if count >5 and count < 10: #改成紅燈
            event.clear() #把標誌位清了
            print("紅燈")
        elif count >10:
            event.set() #變綠燈
            count = 0
        else:
            print("綠燈")
        time.sleep(1)
        count +=1

def car(name):
    while True:
        if event.is_set(): #代表綠燈
            print("[%s] 正在開過"% name )
            time.sleep(1)
        else:
            print("[%s] 正在等待" %name)
            event.wait()#車的這個執行緒就鎖在這裡不動了,一直到set的時候,才會繼續執行car的這個執行緒


light = threading.Thread(target=lighter,)
light.start()

car1 = threading.Thread(target=car,args=("賓士",))
car1.start()

結果:

綠燈[賓士] 正在開過

綠燈[賓士] 正在開過

綠燈[賓士] 正在開過

紅燈[賓士] 正在等待

紅燈 紅燈 紅燈 綠燈 [賓士] 正在開過 綠燈[賓士] 正在開過

綠燈[賓士] 正在開過

綠燈[賓士] 正在開過

綠燈[賓士] 正在開過

綠燈[賓士] 正在開過

紅燈[賓士] 正在等待

紅燈 紅燈 紅燈 綠燈 [賓士] 正在開過 綠燈[賓士] 正在開過

[賓士] 正在開過綠燈

[賓士] 正在開過綠燈

[賓士] 正在開過綠燈

[賓士] 正在開過綠燈

[賓士] 正在開過紅燈