在python項目開發中,線程thread使用是比較常見的,在前面的文章中我們介紹了 python線程的創建 以及 線程互斥鎖 ,今天還要額外介紹一個與線程相關的內容 – 事件Event。
一.python事件Event相關函數介紹
set() — 全局內置標誌Flag,將標誌Flag 設置爲 True,通知在等待狀態(wait)的線程恢復運行;
isSet() — 獲取標誌Flag當前狀態,返回True 或者 False;
wait() — 一旦調用,線程將會處於阻塞狀態,直到等待其他線程調用set()函數恢復運行;
clear() — 將標誌設置爲False;
二.python事件Event原理
事件event中有一個全局內置標誌Flag,值爲 True 或者False。使用wait()函數的線程會處於阻塞狀態,此時Flag指爲False,直到有其他線程調用set()函數讓全局標誌Flag置爲True,其阻塞的線程立刻恢復運行,還可以用isSet()函數檢查當前的Flag狀態.
三.python事件Event使用
假如有這樣一個場景:有10個單身狗,對面100米有10個美女,同時起跑,一人一個,自由選擇,先到先得…..
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個人博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com @File:python_event.py @Time:2019/10/20 21:25 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累! """ # 導入線程模塊 import threading # 創建event事件 eEvent = threading.Event() def get_girl_friend(id): print("單身狗{}都準備完畢,內置Flag狀態:{}.....".format(id,eEvent.isSet())) eEvent.wait() print("單身狗%d告別單身....."%id) if __name__ == "__main__": thread_list = list() for i in range(1,11): # 創建並初始化線程 t = threading.Thread(target=get_girl_friend,args=(i,)) # 啓動線程 t.start() # 將線程句柄添加list列表中 thread_list.append(t) # 所有線程準備完畢,將event內置Flag設置爲True,恢復正在阻塞的線程 eEvent.set() # 遍歷列表,阻塞主線程 for t in thread_list: # 阻塞主線程,等待所有子線程結束 t.join() print("程序結束!")
輸出結果:
單身狗1都準備完畢,內置Flag狀態:False.....
單身狗2都準備完畢,內置Flag狀態:False.....
單身狗3都準備完畢,內置Flag狀態:False.....
單身狗4都準備完畢,內置Flag狀態:False.....
單身狗5都準備完畢,內置Flag狀態:False.....
單身狗6都準備完畢,內置Flag狀態:False.....
單身狗7都準備完畢,內置Flag狀態:False.....
單身狗8都準備完畢,內置Flag狀態:False.....
單身狗9都準備完畢,內置Flag狀態:False.....
單身狗10都準備完畢,內置Flag狀態:False.....
單身狗5告別單身,內置Flag狀態:True.....
單身狗6告別單身,內置Flag狀態:True.....
單身狗7告別單身,內置Flag狀態:True.....
單身狗1告別單身,內置Flag狀態:True.....
單身狗8告別單身,內置Flag狀態:True.....
單身狗10告別單身,內置Flag狀態:True.....
單身狗4告別單身,內置Flag狀態:True.....
單身狗9告別單身,內置Flag狀態:True.....
單身狗3告別單身,內置Flag狀態:True.....
單身狗2告別單身,內置Flag狀態:True.....
程序結束!
四.重點總結
注意互斥鎖Lock與事件Event區別,需求不同,使用方式也不同:
互斥鎖Lock主要針對多個線程同時操作同一個數據,使用互斥鎖可以保證數據正常修改或者訪問;
事件Event主要用於喚醒正在阻塞等待狀態的線程;
猜你喜歡:
轉載請註明:猿說Python » python 事件Event