python線程事件Event的應(yīng)用

一.python事件Event相關(guān)函數(shù)介紹

10余年的沙坡頭網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整沙坡頭建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“沙坡頭網(wǎng)站設(shè)計(jì)”,“沙坡頭網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

線程之間用于交互的一個(gè)對(duì)象,這個(gè)event是一個(gè)內(nèi)部的標(biāo)簽,線程可以等待這個(gè)標(biāo)簽的狀態(tài),舉個(gè)例子,比如紅綠燈是一個(gè)線程,三輛汽車是3個(gè)線程,如果為紅燈,則三個(gè)汽車的線程必須要停止,如果是綠燈,則三個(gè)汽車的線程就可以跑起來。

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;

二.python事件Event原理

事件event中有一個(gè)全局內(nèi)置標(biāo)志Flag,值為 True 或者False。使用wait()函數(shù)的線程會(huì)處于阻塞狀態(tài),此時(shí)Flag指為False,直到有其他線程調(diào)用set()函數(shù)讓全局標(biāo)志Flag置為True,其阻塞的線程立刻恢復(fù)運(yùn)行,還可以用isSet()函數(shù)檢查當(dāng)前的Flag狀態(tài).

三.python事件Event使用

假如有這樣一個(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)入線程模塊

importthreading

 

# 創(chuàng)建event事件

eEvent=threading.Event()

 

defget_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()

 

    foriinrange(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è)置為True,恢復(fù)正在阻塞的線程

    eEvent.set()

 

    # 遍歷列表,阻塞主線程

    fortinthread_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é)束!

四.重點(diǎn)總結(jié)

注意互斥鎖Lock與事件Event區(qū)別,需求不同,使用方式也不同:

互斥鎖Lock主要針對(duì)多個(gè)線程同時(shí)操作同一個(gè)數(shù)據(jù),使用互斥鎖可以保證數(shù)據(jù)正常修改或者訪問;

事件Event主要用于喚醒正在阻塞等待狀態(tài)的線程;

當(dāng)前文章:python線程事件Event的應(yīng)用
文章來源:http://muchs.cn/article22/ijogcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、搜索引擎優(yōu)化手機(jī)網(wǎng)站建設(shè)、企業(yè)建站、建站公司、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)