python多線程之事件Event的使用詳解
前言
小伙伴a,b,c圍著吃火鍋,當(dāng)菜上齊了,請客的主人說:開吃!,于是小伙伴一起動筷子,這種場景如何實(shí)現(xiàn)
Event(事件)
Event(事件):事件處理的機(jī)制:全局定義了一個內(nèi)置標(biāo)志Flag,如果Flag值為 False,那么當(dāng)程序執(zhí)行 event.wait方法時就會阻塞,如果Flag值為True,那么event.wait 方法時便不再阻塞。
Event其實(shí)就是一個簡化版的 Condition。Event沒有鎖,無法使線程進(jìn)入同步阻塞狀態(tài)。
Event()
- set(): 將標(biāo)志設(shè)為True,并通知所有處于等待阻塞狀態(tài)的線程恢復(fù)運(yùn)行狀態(tài)。
- clear(): 將標(biāo)志設(shè)為False。
- wait(timeout): 如果標(biāo)志為True將立即返回,否則阻塞線程至等待阻塞狀態(tài),等待其他線程調(diào)用set()。
- isSet(): 獲取內(nèi)置標(biāo)志狀態(tài),返回True或False。
Event案例1
場景:小伙伴a和b準(zhǔn)備就緒,當(dāng)收到通知event.set()的時候,會執(zhí)行a和b線程
# coding:utf-8 import threading import time event = threading.Event() def chihuoguo(name): # 等待事件,進(jìn)入等待阻塞狀態(tài) print '%s 已經(jīng)啟動' % threading.currentThread().getName() print '小伙伴 %s 已經(jīng)進(jìn)入就餐狀態(tài)!'%name time.sleep(1) event.wait() # 收到事件后進(jìn)入運(yùn)行狀態(tài) print '%s 收到通知了.' % threading.currentThread().getName() print '小伙伴 %s 開始吃咯!'%name # 設(shè)置線程組 threads = [] # 創(chuàng)建新線程 thread1 = threading.Thread(target=chihuoguo, args=("a", )) thread2 = threading.Thread(target=chihuoguo, args=("b", )) # 添加到線程組 threads.append(thread1) threads.append(thread2) # 開啟線程 for thread in threads: thread.start() time.sleep(0.1) # 發(fā)送事件通知 print '主線程通知小伙伴開吃咯!' event.set()
運(yùn)行結(jié)果:
Thread-1 已經(jīng)啟動
小伙伴 a 已經(jīng)進(jìn)入就餐狀態(tài)!
Thread-2 已經(jīng)啟動
小伙伴 b 已經(jīng)進(jìn)入就餐狀態(tài)!
主線程通知小伙伴開吃咯!
Thread-1 收到通知了.
小伙伴 a 開始吃咯!
Thread-2 收到通知了.
小伙伴 b 開始吃咯!
Event案例2
場景:當(dāng)小伙伴a,b,c集結(jié)完畢后,請客的人發(fā)話:開吃咯!
# coding:utf-8 import threading import time event = threading.Event() def chiHuoGuo(name): # 等待事件,進(jìn)入等待阻塞狀態(tài) print '%s 已經(jīng)啟動' % threading.currentThread().getName() print '小伙伴 %s 已經(jīng)進(jìn)入就餐狀態(tài)!'%name time.sleep(1) event.wait() # 收到事件后進(jìn)入運(yùn)行狀態(tài) print '%s 收到通知了.' % threading.currentThread().getName() print '%s 小伙伴 %s 開始吃咯!'%(time.time(), name) class myThread (threading.Thread): # 繼承父類threading.Thread def __init__(self, name): '''重寫threading.Thread初始化內(nèi)容''' threading.Thread.__init__(self) self.people = name def run(self): # 把要執(zhí)行的代碼寫到run函數(shù)里面 線程在創(chuàng)建后會直接運(yùn)行run函數(shù) '''重寫run方法''' chiHuoGuo(self.people) # 執(zhí)行任務(wù) print("qq交流群:226296743") print("結(jié)束線程: %s" % threading.currentThread().getName()) # 設(shè)置線程組 threads = [] # 創(chuàng)建新線程 thread1 = myThread("a") thread2 = myThread("b") thread3 = myThread("c") # 添加到線程組 threads.append(thread1) threads.append(thread2) threads.append(thread3) # 開啟線程 for thread in threads: thread.start() time.sleep(0.1) # 發(fā)送事件通知 print '集合完畢,人員到齊了,開吃咯!' event.set()
運(yùn)行結(jié)果:
Thread-1 已經(jīng)啟動
小伙伴 a 已經(jīng)進(jìn)入就餐狀態(tài)!
Thread-2 已經(jīng)啟動
小伙伴 b 已經(jīng)進(jìn)入就餐狀態(tài)!
Thread-3 已經(jīng)啟動
小伙伴 c 已經(jīng)進(jìn)入就餐狀態(tài)!
集合完畢,人員到齊了,開吃咯!
Thread-1 收到通知了.
1516780957.47 小伙伴 a 開始吃咯!
qq交流群:226296743
結(jié)束線程: Thread-1
Thread-3 收到通知了.
1516780957.47 小伙伴 c 開始吃咯!Thread-2 收到通知了.
qq交流群:2262967431516780957.47 小伙伴 b 開始吃咯!結(jié)束線程: Thread-3
qq交流群:226296743
結(jié)束線程: Thread-2
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python多線程同步Lock、RLock、Semaphore、Event實(shí)例
- 分析Python感知線程狀態(tài)的解決方案之Event與信號量
- Python中使用threading.Event協(xié)調(diào)線程的運(yùn)行詳解
- python基于event實(shí)現(xiàn)線程間通信控制
- python Event事件、進(jìn)程池與線程池、協(xié)程解析
- 詳解Python 多線程 Timer定時器/延遲執(zhí)行、Event事件
- 詳解python多線程、鎖、event事件機(jī)制的簡單使用
- Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信
- python中Event實(shí)現(xiàn)線程間同步介紹
相關(guān)文章
Python接口自動化淺析logging日志原理及模塊操作流程
這篇文章主要為大家介紹了Python接口自動化系列文章淺析logging日志原理及模塊操作流程,文中詳細(xì)說明了為什么需要日志?日志是什么?以及日志用途等基本的原理2021-08-08python 遍歷可迭代對象的實(shí)現(xiàn)方法
本文主要介紹了python 遍歷可迭代對象的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python報錯TypeError: ‘NoneType‘ object is
在Python編程中,TypeError 是一個常見的錯誤,它表明代碼中存在類型不匹配的問題,TypeError: 'NoneType' object is not subscriptable 是一個具體的例子,本文將探討這個錯誤的原因,并提供幾種解決方案,需要的朋友可以參考下2024-10-10Python使用GeoIP2實(shí)現(xiàn)地圖定位
GeoIP2是一種IP地址定位庫,它允許開發(fā)人員根據(jù)IP地址查找有關(guān)位置和地理位置的信息,這篇文章主要為大家介紹了python如何使用GeoIP2實(shí)現(xiàn)地圖定位,感興趣的可以了解下2023-10-10python格式化輸出實(shí)例(居中、靠右及靠左對齊)
所謂格式化輸出就是數(shù)據(jù)按照某種特殊的格式和要求進(jìn)行輸出,下面這篇文章主要給大家介紹了關(guān)于python格式化輸出(居中、靠右及靠左對齊)的相關(guān)資料,文中介紹了format方式、其他擴(kuò)展寫法以及'%'方式,需要的朋友可以參考下2022-04-04