python event_Python线程event

An event is a simple synchronization object;

the event represents an internal flag, and threads

can wait for the flag to be set, or set or clear the flag themselves.

event = threading.Event()

python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set

# a client thread can wait for the flag to be set

event.wait()

# a server thread can set or reset it

event.set()

event.clear()

If the flag is set, the wait method doesn’t do anything.

If the flag is cleared, wait will block until it becomes set again.

Any number of threads may wait for the same event.

事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么event.wait 方法时便不再阻塞。

clear:将“Flag”设置为False

set:将“Flag”设置为True

用 threading.Event 实现线程间通信:

使用threading.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到线程对象中,

Event默认内置了一个标志,初始值为False。

一旦该线程通过wait()方法进入等待状态,直到另一个线程调用该Event的set()方法将内置标志设置为True时,

该Event会通知所有等待状态的线程恢复运行。

通过Event来实现两个或多个线程间的交互,下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红灯停,绿灯行的规则。

import time,threading

event = threading.Event()#生成一个event对象

def light():

count = 0

event.set()#先设置绿灯

while True:

if count > 5 and count < 10:#改成红灯

event.clear()#把标志位清空

print("\033[41;1m红灯.....\033[0m")

elif count >10:

event.set()#变绿灯

count = 0

else:

print("\033[42;1m绿灯.....\033[0m")

time.sleep(1)

count += 1

def car(name):

while True:

if event.is_set():#如果设置了标志位,代表绿灯

print('[%s] running...'%name)

time.sleep(1)

else:

print('%s sees 看到红灯,等着。。。'%name)

event.wait()#wait方法是等待标志位被设定

print('\033[34;1m[%s] 绿灯了,走。。。\033[0m'%name)

l = threading.Thread(target=light,)

l.start()

car1=threading.Thread(target=car,args=('特斯拉',))

car1.start()

另一种写法:

import threading,time

import random

def light():

if not event.isSet():#判断标志位是不是被set设定

event.set() #wait就不阻塞 #绿灯状态

count = 0

while True:

if count < 10:

print('\033[42;1m--green light on---\033[0m')

elif count <13:

print('\033[43;1m--yellow light on---\033[0m')

elif count <20:

if event.isSet():

event.clear()

print('\033[41;1m--red light on---\033[0m')

else:

count = 0

event.set() #打开绿灯

time.sleep(1)

count +=1

def car(n):

while 1:

time.sleep(random.randrange(10))

if event.isSet(): #绿灯

print("car [%s] is running.." % n)

else:

print("car [%s] is waiting for the red light.." %n)

if __name__ == '__main__':

event = threading.Event()

Light = threading.Thread(target=light)

Light.start()

for i in range(3):

t = threading.Thread(target=car,args=(i,))

t.start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值