python學習筆記 day39 事件 執行緒

2022-02-06 19:42:46 字數 1573 閱讀 3044

其實就是一種標誌,事件預設阻塞狀態,阻塞狀態下執行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 提取不重複的整數 題目描述 從上往下列印出二叉樹的每個節點,同層節點...