同進程的一樣,線程的一個關鍵特性是每個線程都是獨立運行且狀態不可預測。如果程序中的其 他線程需要通過判斷某個線程的狀態來確定自己下一步的操作,這時線程同步問題就會變得非常棘手。為了解決這些問題,我們需要使用threading庫中的Event對象。 對象包含一個可由線程設置的信號標志,它允許線程等待某些事件的發生。在 初始情況下,Event對象中的信號標志被設置為假。如果有線程等待一個Event對象, 而這個Event對象的標志為假,那么這個線程將會被一直阻塞直至該標志為真。一個線程如果將一個Event對象的信號標志設置為真,它將喚醒所有等待這個Event對象的線程。如果一個線程等待一個已經被設置為真的Event對象,那么它將忽略這個事件, 繼續執行
Event幾種方法:
event.isSet():返回event的狀態值;
event.wait():如果 event.isSet()==False將阻塞線程;
event.set(): 設置event的狀態值為True,所有阻塞池的線程激活進入就緒狀態, 等待操作系統調度;
event.clear():恢復event的狀態值為False。
from threading import Thread,Event
import time
event=Event()
def light():
print('紅燈正亮着')
time.sleep(3)
event.set() #綠燈亮
def car(name):
print('車%s正在等綠燈' %name)
event.wait() #等燈綠 此時event為False,直到event.set()將其值設置為True,才會繼續運行.
print('車%s通行' %name)
if __name__ == '__main__':
# 紅綠燈
t1=Thread(target=light)
t1.start()
# 車
for i in range(10):
t=Thread(target=car,args=(i,))
t.start()
