事件Event:
同行程的一樣,執行緒的一個關鍵特性是每個執行緒都是獨立運行且狀態不可預測,如果程式中的其他執行緒需要通過判斷某個執行緒的狀態來確定自己下一步的操作,這時執行緒同步問題就會變得非常棘手,為了解決這些問題,我們需要使用threading庫中的Event物件, 物件包含一個可由執行緒設定的信號標志,它允許執行緒等待某些事件的發生,
在初始情況下,Event物件中的信號標志被設定為false,如果有執行緒等待一個Event物件, 而這個Event物件的標志為false,那么這個執行緒將會被一直阻塞直至該標志為真,一個執行緒如果將一個Event物件的信號標志設定為真,它將喚醒所有等待這個Event物件的執行緒,如果一個執行緒等待一個已經被設定為真的Event物件,那么它將忽略這個事件,繼續執行,
Event方法:
1、event.isSet():當且僅當內部標志為True時回傳True,
2、event.set():將內部標志設定為True,所有等待它成為True的執行緒都被喚醒,當標志保持在True的狀態時,執行緒呼叫wait()是不會阻塞的,
3、event.clear():將內部標志重置為False,隨后,呼叫wait()的執行緒將阻塞,直到另一個執行緒呼叫set()將內部標志重新設定為True,
4、event.wait():阻塞直到內部標志為真,如果內部標志在wait()方法呼叫時為True,則立即回傳,否則,則阻塞,直到另一個執行緒呼叫set()將標志設定為True,或發生超時,
紅綠燈示例:
1 import threading 2 import time 3 4 event = threading.Event() # 實體化event 5 6 def Light(): 7 count = 0 8 while True: 9 if count > 5 and count < 10: 10 event.set() 11 # print("紅燈ing...") 12 time.sleep(1) 13 elif count > 10: 14 event.clear() 15 count = 0 16 else: 17 # print("綠燈ing...") 18 time.sleep(1) 19 count += 1 20 21 light = threading.Thread(target=Light) 22 light.start() 23 24 def Car(name): 25 while True: 26 if event.is_set(): 27 print("[%s] going...." % name) 28 time.sleep(1) 29 else: 30 print("[%s] 等待綠燈,,," % name) 31 event.wait() 32 33 car1 = threading.Thread(target=Car,args=("car1",)) 34 car1.start()
執行結果:
1 [car1] 等待綠燈,,, 2 [car1] going.... 3 [car1] going.... 4 [car1] going.... 5 [car1] going.... 6 [car1] going.... 7 [car1] going.... 8 [car1] 等待綠燈,,, 9 [car1] going.... 10 [car1] going.... 11 [car1] going.... 12 [car1] going.... 13 [car1] going.... 14 [car1] going.... 15 [car1] 等待綠燈,,, 16 [car1] going.... 17 [car1] going.... 18 19 Process finished with exit code -1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/43177.html
標籤:Python
上一篇:Python實作電腦控制,這個庫讓你可以控制和監控輸入設備
下一篇:第121題:買賣股票的最佳時機
