Event事件的使用练习

Event事件的使用练习

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 wait or clear the flag themselves.

能够等待这个表示的设定,等待,清除标着

event = threading.Event()

获取一个event事件 通过 线程模块总的事件方法

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() 清除事件标志

根据服务端标记的设定,客户端线程可以去根据标记的情况(event.is_set())来进行线程之间的切换

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.

一些列的线程将会等待同样的设定

简单的总结就是 通过Event来实现两个或多个线程间的交互,

下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红灯停,绿灯行的规则。

代码演示:

'''
思路:
1.创建一个event事件  在threading模块中的
2.创建灯线程要执行的程序 创建的时候要在程序中设置事件的标志位  来改变灯的状态

3.创建车线程要执行的程序  在程序中要随时判断事件标志位的状态来改变车的运行状态
4.在主程序中创建灯的线程 并启动线程
5.创建车的线程  启动线程
'''
# 导入需要的模块
import time,threading
#定义全局的事件标志位
event=threading.Event()   # 返回的是一个事件标志位
# 创建灯线程要执行的程序
def lighter():
    #定义灯亮的时间数
    count=0
    #设置事件标志位
    event.set()
    while True:
        if count>5 and count < 10:
            event.clear() # 开始改变灯的颜色就是清除标志位
            print("\033[41;1mred light is on....\033[0m")
        elif count > 10 :
            event.set()  # 红灯时间到 开始改变灯的颜色
            print("\033[42;1mgreen light is on....\033[0m")
            count=0
        else: # 因为刚开始进来的时候  就是绿灯
            print("\033[42;1mgreen light is on....\033[0m")
        #改变灯亮的时间
        count+=1
        time.sleep(1)

# 设置车的线程程序
def car_run():
    while True:
        if event.is_set(): #判断灯的状态
            print("看见绿灯了 ,可以继续行使了============")
        else:
            print("看见红灯了  现在要停下.........................")
            event.wait()   # 这里如果不设置等待的话 会有什么情况呢??
            # 成为阻塞状态  就一直等在这里直到 事件状态改变了 然后才能继续循环
        time.sleep(1)


# 创建灯的线程
print("主线程在创建新的线程",threading.current_thread().name)
print("主线程在创建新的线程",threading.currentThread)
# 开始创建灯的线程
light=threading.Thread(target=lighter,)
light.start()
# 创建车的线程
car=threading.Thread(target=car_run,)
car.start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值