Python中協程Event()函數


python線程的事件用於主線程控制其他線程的執行,事件主要提供了三個方法wait、clear、set

事件處理的機制:全局定義了一個“Flag”,如果“Flag”值為 False,那么當程序執行 event.wait 方法時就會阻塞,如果“Flag”值為True,那么執行event.wait 方法時便不再阻塞。

  • clear:將“Flag”設置為False
  • set:將“Flag”設置為True

用 threading.Event 實現線程間通信,使用threading.Event可以使一個線程等待其他線程的通知,我們把這個Event傳遞到線程對象中,

Event默認內置了一個標志,初始值為False。一旦該線程通過wait()方法進入等待狀態,直到另一個線程調用該Event的set()方法將內置標志設置為True時,該Event會通知所有等待狀態的線程恢復運行。

 1 #!/usr/bin/python3
 2 #_*_ coding: UTF-8 _*_
 3 
 4 
 5 import threading, time
 6 import random
 7 
 8 def light():
 9     if not event.isSet():
10         event.set()  #wait就不阻塞 #綠燈狀態
11     count = 0
12     i=0
13     while True:
14         if count <10:
15             print("---green light on ---")
16         elif count<13:
17             print("---yellow light on ---")
18         elif count <20:
19             if event.isSet():
20                 event.clear()
21             print("---red light on ---")
22         else:
23             count = 0
24             event.set()#打開綠燈
25         time.sleep(1)
26         count +=1
27         i+=1
28         if(i>20):
29             break
30 def car(n):
31     i=0
32     while 1:
33         time.sleep(random.randrange(3))
34         if event.isSet():#如果是綠燈
35             print("car [%s] is running.."%n)
36         else:
37             print("car [%s] is waiting for the red light.."%n)
38         if(i>10):
39             break
40         else:
41             i+=1
42         
43 if __name__ == '__main__':
44     event = threading.Event()
45     Light = threading.Thread(target=light)
46     Light.start()
47     for i in range(3):
48         t = threading.Thread(target=car,args=(i,))
49         t.start()
50     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM