#執行緒中的訊號量
#和程序中的訊號量概念一樣,建立好訊號量的深度後,同一時間只有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...