您好,登錄后才能下訂單哦!
一.python事件Event相關(guān)函數(shù)介紹
set() — 全局內(nèi)置標(biāo)志Flag,將標(biāo)志Flag 設(shè)置為 True,通知在等待狀態(tài)(wait)的線程恢復(fù)運(yùn)行;
isSet() — 獲取標(biāo)志Flag當(dāng)前狀態(tài),返回True 或者 False;
wait() — 一旦調(diào)用,線程將會(huì)處于阻塞狀態(tài),直到等待其他線程調(diào)用set()函數(shù)恢復(fù)運(yùn)行;
clear() — 將標(biāo)志設(shè)置為False;
事件event中有一個(gè)全局內(nèi)置標(biāo)志Flag,值為 True 或者False。使用wait()函數(shù)的線程會(huì)處于阻塞狀態(tài),此時(shí)Flag指為False,直到有其他線程調(diào)用set()函數(shù)讓全局標(biāo)志Flag置為T(mén)rue,其阻塞的線程立刻恢復(fù)運(yùn)行,還可以用isSet()函數(shù)檢查當(dāng)前的Flag狀態(tài).
假如有這樣一個(gè)場(chǎng)景:有10個(gè)單身狗,對(duì)面100米有10個(gè)美女,同時(shí)起跑,一人一個(gè),自由選擇,先到先得…..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # !usr/bin/env python # -*- coding:utf-8 _*- # 導(dǎo)入線程模塊 import threading
# 創(chuàng)建event事件 eEvent = threading.Event()
def get_girl_friend(id): print("單身狗{}都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):{}.....".format(id,eEvent.isSet())) eEvent.wait() print("單身狗%d告別單身....."%id)
if __name__ == "__main__":
thread_list = list()
for i in range(1,11): # 創(chuàng)建并初始化線程 t = threading.Thread(target=get_girl_friend,args=(i,)) # 啟動(dòng)線程 t.start() # 將線程句柄添加list列表中 thread_list.append(t)
# 所有線程準(zhǔn)備完畢,將event內(nèi)置Flag設(shè)置為T(mén)rue,恢復(fù)正在阻塞的線程 eEvent.set()
# 遍歷列表,阻塞主線程 for t in thread_list: # 阻塞主線程,等待所有子線程結(jié)束 t.join()
print("程序結(jié)束!") |
輸出結(jié)果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 單身狗1都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗2都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗3都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗4都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗5都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗6都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗7都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗8都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗9都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗10都準(zhǔn)備完畢,內(nèi)置Flag狀態(tài):False..... 單身狗5告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗6告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗7告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗1告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗8告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗10告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗4告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗9告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗3告別單身,內(nèi)置Flag狀態(tài):True..... 單身狗2告別單身,內(nèi)置Flag狀態(tài):True..... 程序結(jié)束! |
注意互斥鎖Lock與事件Event區(qū)別,需求不同,使用方式也不同:
互斥鎖Lock主要針對(duì)多個(gè)線程同時(shí)操作同一個(gè)數(shù)據(jù),使用互斥鎖可以保證數(shù)據(jù)正常修改或者訪問(wèn);
事件Event主要用于喚醒正在阻塞等待狀態(tài)的線程;
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。