python 線程事件Event(30)

在python項目開發中,線程thread使用是比較常見的,在前面的文章中咱們介紹了 python線程的建立  以及 線程互斥鎖 ,今天還要額外介紹一個與線程相關的內容 – 事件Eventpython

 

一.python事件Event相關函數介紹

set() — 全局內置標誌Flag,將標誌Flag 設置爲 True,通知在等待狀態(wait)的線程恢復運行;git

isSet() — 獲取標誌Flag當前狀態,返回True 或者 False;github

wait() — 一旦調用,線程將會處於阻塞狀態,直到等待其餘線程調用set()函數恢復運行;微信

clear() — 將標誌設置爲False;app

 

二.python事件Event原理

事件event中有一個全局內置標誌Flag,值爲 True 或者False。使用wait()函數的線程會處於阻塞狀態,此時Flag指爲False,直到有其餘線程調用set()函數讓全局標誌Flag置爲True,其阻塞的線程馬上恢復運行,還能夠用isSet()函數檢查當前的Flag狀態.ide

 

摳鼻子

 

三.python事件Event使用

假若有這樣一個場景:有10個單身狗,對面100米有10個美女,同時起跑,一人一個,自由選擇,先到先得…..函數

1spa

2線程

3code

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

38

39

40

41

42

43

44

45

46

47

# !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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

單身狗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.....

程序結束!

bug

 

四.重點總結

注意互斥鎖Lock與事件Event區別,需求不一樣,使用方式也不一樣:

互斥鎖Lock主要針對多個線程同時操做同一個數據,使用互斥鎖能夠保證數據正常修改或者訪問;

事件Event主要用於喚醒正在阻塞等待狀態的線程;

 

 

猜你喜歡:

1.python線程建立和參數傳遞

2.python互斥鎖Lock

3.python列表推導式

4.python字典推導式

 

轉載請註明猿說Python » python 事件Event

相關文章
相關標籤/搜索