溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python多線程之事件Event的使用詳解

發(fā)布時(shí)間:2020-09-16 21:15:38 來源:腳本之家 閱讀:130 作者:上海-悠悠 欄目:開發(fā)技術(shù)

前言

小伙伴a,b,c圍著吃火鍋,當(dāng)菜上齊了,請(qǐng)客的主人說:開吃!,于是小伙伴一起動(dòng)筷子,這種場(chǎng)景如何實(shí)現(xiàn)

Event(事件)

Event(事件):事件處理的機(jī)制:全局定義了一個(gè)內(nèi)置標(biāo)志Flag,如果Flag值為 False,那么當(dāng)程序執(zhí)行 event.wait方法時(shí)就會(huì)阻塞,如果Flag值為True,那么event.wait 方法時(shí)便不再阻塞。

Event其實(shí)就是一個(gè)簡(jiǎn)化版的 Condition。Event沒有鎖,無法使線程進(jìn)入同步阻塞狀態(tài)。

Event()

  1. set(): 將標(biāo)志設(shè)為True,并通知所有處于等待阻塞狀態(tài)的線程恢復(fù)運(yùn)行狀態(tài)。
  2. clear(): 將標(biāo)志設(shè)為False。
  3. wait(timeout): 如果標(biāo)志為True將立即返回,否則阻塞線程至等待阻塞狀態(tài),等待其他線程調(diào)用set()。
  4. isSet(): 獲取內(nèi)置標(biāo)志狀態(tài),返回True或False。

Event案例1

場(chǎng)景:小伙伴a和b準(zhǔn)備就緒,當(dāng)收到通知event.set()的時(shí)候,會(huì)執(zhí)行a和b線程

# coding:utf-8

import threading
import time

event = threading.Event()


def chihuoguo(name):
  # 等待事件,進(jìn)入等待阻塞狀態(tài)
  print '%s 已經(jīng)啟動(dò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)啟動(dòng)
小伙伴 a 已經(jīng)進(jìn)入就餐狀態(tài)!
Thread-2 已經(jīng)啟動(dòng)
小伙伴 b 已經(jīng)進(jìn)入就餐狀態(tài)!
主線程通知小伙伴開吃咯!
Thread-1 收到通知了.
小伙伴 a 開始吃咯!
Thread-2 收到通知了.
小伙伴 b 開始吃咯!

Event案例2

場(chǎng)景:當(dāng)小伙伴a,b,c集結(jié)完畢后,請(qǐng)客的人發(fā)話:開吃咯!

# coding:utf-8

import threading
import time

event = threading.Event()


def chiHuoGuo(name):
  # 等待事件,進(jìn)入等待阻塞狀態(tài)
  print '%s 已經(jīng)啟動(dò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)建后會(huì)直接運(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)啟動(dòng)
小伙伴 a 已經(jīng)進(jìn)入就餐狀態(tài)!
Thread-2 已經(jīng)啟動(dòng)
小伙伴 b 已經(jīng)進(jìn)入就餐狀態(tài)!
Thread-3 已經(jīng)啟動(dò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交流群:226296743

1516780957.47 小伙伴 b 開始吃咯!結(jié)束線程: Thread-3

qq交流群:226296743
結(jié)束線程: Thread-2

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI