python多線程之事件Event的使用詳解
前言
小伙伴a,b,c圍著吃火鍋,當菜上齊了,請客的主人說:開吃!,于是小伙伴一起動筷子,這種場景如何實現(xiàn)
Event(事件)
Event(事件):事件處理的機制:全局定義了一個內置標志Flag,如果Flag值為 False,那么當程序執(zhí)行 event.wait方法時就會阻塞,如果Flag值為True,那么event.wait 方法時便不再阻塞。
Event其實就是一個簡化版的 Condition。Event沒有鎖,無法使線程進入同步阻塞狀態(tài)。
Event()
- set(): 將標志設為True,并通知所有處于等待阻塞狀態(tài)的線程恢復運行狀態(tài)。
- clear(): 將標志設為False。
- wait(timeout): 如果標志為True將立即返回,否則阻塞線程至等待阻塞狀態(tài),等待其他線程調用set()。
- isSet(): 獲取內置標志狀態(tài),返回True或False。
Event案例1
場景:小伙伴a和b準備就緒,當收到通知event.set()的時候,會執(zhí)行a和b線程
# coding:utf-8
import threading
import time
event = threading.Event()
def chihuoguo(name):
# 等待事件,進入等待阻塞狀態(tài)
print '%s 已經(jīng)啟動' % threading.currentThread().getName()
print '小伙伴 %s 已經(jīng)進入就餐狀態(tài)!'%name
time.sleep(1)
event.wait()
# 收到事件后進入運行狀態(tài)
print '%s 收到通知了.' % threading.currentThread().getName()
print '小伙伴 %s 開始吃咯!'%name
# 設置線程組
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()
運行結果:
Thread-1 已經(jīng)啟動
小伙伴 a 已經(jīng)進入就餐狀態(tài)!
Thread-2 已經(jīng)啟動
小伙伴 b 已經(jīng)進入就餐狀態(tài)!
主線程通知小伙伴開吃咯!
Thread-1 收到通知了.
小伙伴 a 開始吃咯!
Thread-2 收到通知了.
小伙伴 b 開始吃咯!
Event案例2
場景:當小伙伴a,b,c集結完畢后,請客的人發(fā)話:開吃咯!
# coding:utf-8
import threading
import time
event = threading.Event()
def chiHuoGuo(name):
# 等待事件,進入等待阻塞狀態(tài)
print '%s 已經(jīng)啟動' % threading.currentThread().getName()
print '小伙伴 %s 已經(jīng)進入就餐狀態(tài)!'%name
time.sleep(1)
event.wait()
# 收到事件后進入運行狀態(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初始化內容'''
threading.Thread.__init__(self)
self.people = name
def run(self): # 把要執(zhí)行的代碼寫到run函數(shù)里面 線程在創(chuàng)建后會直接運行run函數(shù)
'''重寫run方法'''
chiHuoGuo(self.people) # 執(zhí)行任務
print("qq交流群:226296743")
print("結束線程: %s" % threading.currentThread().getName())
# 設置線程組
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()
運行結果:
Thread-1 已經(jīng)啟動
小伙伴 a 已經(jīng)進入就餐狀態(tài)!
Thread-2 已經(jīng)啟動
小伙伴 b 已經(jīng)進入就餐狀態(tài)!
Thread-3 已經(jīng)啟動
小伙伴 c 已經(jīng)進入就餐狀態(tài)!
集合完畢,人員到齊了,開吃咯!
Thread-1 收到通知了.
1516780957.47 小伙伴 a 開始吃咯!
qq交流群:226296743
結束線程: Thread-1
Thread-3 收到通知了.
1516780957.47 小伙伴 c 開始吃咯!Thread-2 收到通知了.
qq交流群:2262967431516780957.47 小伙伴 b 開始吃咯!結束線程: Thread-3
qq交流群:226296743
結束線程: Thread-2
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Python多線程同步Lock、RLock、Semaphore、Event實例
- 分析Python感知線程狀態(tài)的解決方案之Event與信號量
- Python中使用threading.Event協(xié)調線程的運行詳解
- python基于event實現(xiàn)線程間通信控制
- python Event事件、進程池與線程池、協(xié)程解析
- 詳解Python 多線程 Timer定時器/延遲執(zhí)行、Event事件
- 詳解python多線程、鎖、event事件機制的簡單使用
- Python多線程編程(八):使用Event實現(xiàn)線程間通信
- python中Event實現(xiàn)線程間同步介紹
相關文章
Python使用sqlite3第三方庫讀寫SQLite數(shù)據(jù)庫的方法步驟
數(shù)據(jù)庫非常重要,程序的數(shù)據(jù)增刪改查需要數(shù)據(jù)庫支持,python處理數(shù)據(jù)庫非常簡單,而且不同類型的數(shù)據(jù)庫處理邏輯方式大同小異,下面這篇文章主要給大家介紹了關于Python使用sqlite3第三方庫讀寫SQLite數(shù)據(jù)庫的方法步驟,需要的朋友可以參考下2022-07-07
Python實現(xiàn)1-9數(shù)組形成的結果為100的所有運算式的示例
下面小編就為大家?guī)硪黄狿ython實現(xiàn)1-9數(shù)組形成的結果為100的所有運算式的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Python 訪問限制 private public的詳細介紹
在一個模塊中,我們可能會定義很多函數(shù)和變量。這篇文章主要介紹了Python 訪問限制 private public的詳細介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10

