執行緒中的訊號量和事件

2022-06-22 22:42:12 字數 2064 閱讀 3712

#

執行緒中的訊號量

#和程序中的訊號量概念一樣,建立好訊號量的深度後,同一時間只有n個執行緒可以訪問被訊號量保護的**

#同一時間只有4個執行緒可以訪問被訊號量保護的**

#import time

#from threading import semaphore, thread##

def func(sem, a, b):

#sem.acquire()

#time.sleep(1)

#print(a + b)

#sem.release()##

if __name__ == '__main__':##

sem = semaphore(4) # 建立訊號量,4個深度

#for i in range(10):

#t = thread(target=func, args=(sem, i, i + 5))

#t.start()

#執行緒中的事件

#和程序中的事件概念一樣

#事件的狀態

#false狀態

#wait()阻塞

#true狀態

#wait()非阻塞

#改變事件的狀態

#clear()設定事件狀態為flase,即使wait()阻塞

#set()設定事件狀態為true,即使wait()非阻塞

#執行緒中的事件例子#模擬

#連線資料庫

#檢測資料庫的可連線情況

#起兩個執行緒

#第乙個執行緒:連線資料庫

#第乙個執行緒會阻塞等待這個事件,等待乙個訊號,這個訊號來告訴自己和資料庫之間的網路是通的

#第二個執行緒:檢測與資料庫之間的網路是否是通的

#模擬延時一會後,將事件的狀態設定為true,使這個事件變為非阻塞,此時第乙個執行緒就會檢測到該事件為非阻塞,則會知道與資料庫之間的網路是通的

import

time

import

random

from threading import

event, thread

defconnect_db(e):

'''模擬檢測資料庫可以連線後,則連線資料庫

:param e:

:return:

'''count = 3

while count >0:

#e.wait() # 如果事件e為false,則會阻塞在這裡

e.wait(1) #

wait可以帶引數,表示如果事件是阻塞的話,這裡最長會阻塞1s中

if e.is_set() == true: #

檢測下事件是否為非阻塞,因為到這裡可能是wait阻塞超時導致(這種事件狀態還是為false阻塞),也可能確實是檢測網路的執行緒發的解除阻塞訊號

print('

連線資料庫')

break

else

:

print('

連線資料庫超時')

count -= 1

else

:

print('

連線資料庫到了上限次還沒有連線資料庫成功')

raise timeouterror #

主動丟擲乙個超時異常

defcheck_web(e):

'''檢測資料庫可連線情況,模擬延時一會後,將事件設定為true,變為非阻塞,表示網路是通的

:param e: 事件

:return:

'''time.sleep(random.randint(0, 5))

e.set()

if__name__ == '

__main__':

e = event() #

事件建立好後,預設是false阻塞的

t = thread(target=connect_db, args=(e, ))

t2 = thread(target=check_web, args=(e, ))

t.start()

t2.start()

t.join()

t2.join()

執行緒的 事件 和 訊號量

事件 event 用如下語句建立 handle m hevent createevent null,true,false,null setevent m hevent 函式 resetevent m hevent 函式分別將事件物件置為有訊號狀態和無訊號狀態。訊號量 semaphore 用如下語句建...

執行緒 訊號量

訊號量 訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,呼叫函式sem post 增加訊號量。只有當訊號量值大於 時,才能使用公共資源,使用後,函式sem wait 減少訊號量。函式sem trywait 和函式pthread mutex trylock 起同樣的...

執行緒同步中的鎖和訊號量

由於工作上用到執行緒之間的同步,而且有超時處理,問題是 子主線程等待的時候已經加鎖了,為什麼主線程中還可以再去加鎖給子執行緒傳送訊號呢?pthread cond timedwait 函式有三個入口引數 pthread cond t cond 條件變數 觸發條件 pthread mutex t mut...