Event: 用于线程之间状态的同步。对全局变量不断地做修改。

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

Event.wait() #等着设定全局变量。检测标志位是否有设置,如果标志位没有设置的话,会一直卡在这里。等待标志位被设定。

如果标志位被设定了,代表绿灯,直接通行。wait不阻塞。

如果标志位被清空,代表红灯,wait等待。

多个线程可以等待同一个event的标志位的变化。

Event.set() #设置一个标志位,相当于全局变量

Event.clear() #清空标志位

Event.is_set() #判断是否设置了标志位

理解点:

1.车的线程与红绿灯的线程之间有了关联,车的线程会根据红绿灯的线程而变化。

2.每一次状态的切换,就是一次事件的发生,会相应地做不同的事情。

import time,threading

event=threading.Event()

def lighter():
count=0
event.set() #先设为绿灯
while True:
if count>5 and count<10: #改成红灯
event.clear() #清空标志位,在红灯状态卡10s
print('\033[41;1mred light is on..\033[0m')
elif count>10:
event.set()#变绿灯
count=0
else:
print('\033[42;1mgreen light is on..\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] red light,waiting..'%name)
event.wait()
print('[%s] green is on, start going.'%name ) light=threading.Thread(target=lighter,)
light.start()
car1=threading.Thread(target=car,args=('Tesla',))
car1.start()

运行结果:

green light is on..
[Tesla] running...
green light is on..
[Tesla] running...
green light is on..
[Tesla] running...
[Tesla] running...
green light is on..
[Tesla] running...
green light is on..
[Tesla] running...
green light is on..
[Tesla] running...
red light is on..
red light is on..
[Tesla] red light,waiting..
red light is on..
red light is on..
green light is on..
[Tesla] green is on, start going.
[Tesla] running...
green light is on..
[Tesla] running...

Events-事件-红绿灯的更多相关文章

  1. ActiveX控件的Events事件

    http://labview360.com/article/info.asp?TID=10152&FID=165 Active X函式库 对使用LabVIEW作为开发环境的开发人员来说,如果能 ...

  2. Node.js:events事件模块

    Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例. 大家知道,由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断 ...

  3. Laravel 的 Events(事件) 及 Observers(观察者)

    你是否听说过单一职责原则(single responsibility principle)?我希望是的.它是程序设计的基本原则之一,它基本上的意思就是,一个类有且只有一个职责.换句话说,一个类必须且只 ...

  4. Python并发编程-事件,红绿灯控制

    事件用来控制多个进程同时执行或者阻塞 set和clear 分别用来修改一个事件的状态,True或者False is_set 用来查看一个事件的状态 wait 是依据事件的状态来决定自己是否在wait处 ...

  5. events(事件): 基础1

    1    所有能触发事件的对象都是 EventEmitter 类的实例. 这些对象开放了一个 eventEmitter.on() 函数,允许将一个或多个函数绑定到会被对象触发的命名事件上. 事件名称通 ...

  6. Lind.DDD.Events事件总线~自动化注册

    回到目录 让大叔兴奋的自动化注册 对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它 ...

  7. English trip -- VC(情景课) 6 B Events 事件

    xu言: ...  自己选择的路,就算是爬,也要给我爬完.短短人生数载,我能之止于此? Words appointment  预约 meeting  会议 class movie party prog ...

  8. openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

    1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包 ...

  9. Python全栈开发-Day9-线程/GIL/事件/队列

    本节内容 进程与线程的概念 Python threading 模块 GIL——global interpreter lock Mutex互斥锁(线程锁) Semaphore信号量 Events事件 Q ...

  10. javaScirpt事件详解-原生事件基础(一)

    事件 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,通过监听特定事件的发生,你能响应相关的操作.图片引用:UI Events 事件流 ...

随机推荐

  1. Please ensure JDK installation is valid and compatible with the current OS

    报错如下: Gradle sync failed: Could not run JVM from the selected JDK. Please ensure JDK installation is ...

  2. MySQL高级-性能分析Explain

    1.使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查询语句或是表结构的性能瓶颈 . 2.执行方法:Explain + SQL语句 解释 ...

  3. kaggle入门--泰坦尼克号之灾(手把手教你)

    作者:炼己者 具体操作请看这里-- https://www.jianshu.com/p/e79a8c41cb1a 大家也可以看PDF版,用jupyter notebook写的,视觉效果上感觉会更棒 链 ...

  4. android分析windowManager、window、viewGroup之间关系(二)

    三.接上一节,分析windowManager中添加一个悬浮框的方式,首先看代码 WindowManager.LayoutParams params = new LayoutParams(); para ...

  5. 2019年猪年海报PSD模板-第四部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1WUO4L5PHIHG5hAurv52_2A                        

  6. 2019年猪年海报PSD模板-第三部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/15m6sWTdDzuBfdmHYxJVvbA              

  7. [JSON].valueOf( keyPath )

    语法:[JSON].valueOf( keyPath ) 返回:[任意类型 | null] 说明:获取键名路径原值,它保留原始值的类型 示例: b = sysFile.binary("tes ...

  8. 数据库Mysql的学习(一)-启动和进入

    数据库:按照数据结构来组织储存和管理数据的仓库. Mysql是关系型数据库管理系统 Mysql安装好之后... mysql的启动 1:通过控制面板里的”服务“找到mysql右键启动即可 2:开始菜单搜 ...

  9. Kali渗透测试工具-nslookup

    1.交互模式 终端输入nslookup进入交互模式 (1)查询A地址记录(默认) set q=a A记录简单理解将域名转换成对应的IP地址 (2)查询mail exchanger set q=mx m ...

  10. 使用树莓派实现(山寨)高清视频叠加(HDMI OSD)

    项目需要在HDMI上叠加一些字符包括汉字和数值,要求不能使用台式机,本身也没有HDMI采集卡驱动开发能力,所以通过海思的HDMI编码器将HDMI编码为h.264网络视频流,然后通过树莓派解码显示,做字 ...