其實就是一種標誌,事件預設阻塞狀態,阻塞狀態下執行e.wait()就會一直陷入阻塞狀態(但是e.wait(10)就是設定在阻塞狀態下 e.is_set()=false時只阻塞10秒就結束) ;
e.set() 設定非阻塞狀態,此時e.is_set()=true 並且執行e.wait()不會陷入阻塞 e.wait()對於e.is_set()=true時是沒有任何作用的;
需求是: 先開乙個執行緒檢查資料庫連線是否正常(比如網是否連線)就是使用time.sleep()隨機睡幾秒(1-3秒之間),然後設定事件的狀態e.set() 然後開乙個執行緒去執行資料庫連線的操作(嘗試連線,超過次數就說明連線失敗)這個檢查次數肯定是跟事件的狀態有關的,每0.5秒檢查一次事件的狀態,一共檢查三次,所以總共連線資料庫的機會是3秒,如果資料庫檢查連線 隨機睡的時間是1.5以內,就會在1.5之內把事件的狀態設定為非阻塞,那麼鏈結資料庫需要1.5秒的這段時間就可以讓跳出迴圈,執行連線成功:
from threading import執行結果:thread
from threading import
event
import
time
import
random
def conn_mysql(): #
鏈結資料庫
count=0
try:
while
not e.is_set(): #
判斷事件的狀態,如果咋1.5秒以內檢查資料庫(check_conn0)的操作可以把e.set()設定上,就可以跳出迴圈,也就是連線成功
if count>=3: #
check_conn 睡超過1.5秒,沒來得及讓事件變為非阻塞,這裡迴圈了三次耗時1.5秒,就會丟擲異常
raise
timeouterror
else
: count += 1
#time.sleep(0.5)
print("
嘗試連線第%s次
"%count)
e.wait(0.5) #
一直阻塞變為只阻塞0.5秒 wait()只有在事件是阻塞狀態時才會 進入阻塞狀態,e.set()之後在執行e.wait()是沒有任何效果的
print("
連線成功")
except
timeouterror:
print("
連線失敗")
defcheck_conn():
time.sleep(random.randint(1,3)) #
隨機睡,如果事件在1.5秒以內,就可以有機會設定事件非阻塞狀態,因為conn_mysql最多需要三次機會,一共1.5秒
e.set()
e=event()
t2=thread(target=check_conn)
t2.start()
t=thread(target=conn_mysql)
t.start()
day 3 9基礎複習
1.不要在模組之間相互呼叫,否則會出現麻繩現象,避免迴圈匯入。用來判斷值是否相等 分別指向兩個空間,但是空間裡面的內容相同 is 判斷指向是否相等。例 a 11,22,33 b 11,22,33 a b true a is b false id a 1398041200093640 id b 139...
day39 程序 佇列
佇列queue 程序之間資料是隔離的,不共享的,但是通過multiprocessing的queue可以實現程序之間的通訊。1 先進先出 把1 2 3放到佇列裡,按1 2 3的順序拿出來。from multiprocessing import queue q queue q.put 1 q.put 2...
程式設計之旅 Day39
day39 學習內容 1.劍指offer 面試題32 從上到下列印二叉樹 面試題32 把二叉樹列印成多行 面試題32 按之字形順序列印二叉樹 面試題36 二叉搜尋樹與雙向鍊錶 3.華為機試題 例1 取近似值 例2 合併表記錄 例3 提取不重複的整數 題目描述 從上往下列印出二叉樹的每個節點,同層節點...