一、概述

  我们日常生活中经常遇到红绿灯,我们就很好理解红绿灯的例子,就是红灯停,绿灯行。

  我现在生成一个线程,这个线程我让它扮演红绿灯,它每过一段时间就变成绿灯,又过一段时间变成红灯,又变成黄灯。然后我再生成3-5个线程作为车。车看见红灯,它就停下来等着,如果说是绿灯,车子就走。所以就涉及到红灯这个线程,红绿灯的这个线程就跟车线程之前产生了依赖了。就是红绿灯这个线程必须在绿灯的时候才能走,在红灯的时候就立刻停下来。所以互相之前,一个线程会根据另外一个线程的状态产生一些变化。类似这种场景的实现,就讲到了一个知识点:event,即事件。

  就是我们红绿灯这个线程每隔30秒,由绿灯变成红灯,然后红灯会持续20秒,也就是没一次的状态切换,就是一次事件的发生。然后它切换了一次灯的状态。其他的车就会根据这个状态做不同的动作,这个就是因为一个事件导致其他事件的连锁变化。

 二、事件(event)

2.1、英文说明

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()   #设置一个事件的全局变量

event.is_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.

如果标志位被清空,代表红灯,wait等待变绿灯。
Any number of threads may wait for the same event.

多个线程可以同时等待一个相同的时间。

2.2、红绿灯例子

说明:定义一个红绿灯的函数 ->定义车子的函数->启动两个线程

import threading,timeevent = threading.Event()   #设置事件的全局变量
def lighter():"红绿灯"count = 0event.set()   #先设置绿灯while True:if count > 5 and count < 10:   #改成红灯event.clear()    #清除标志位print("\033[41mred light is on ....\033[0m")elif count > 10:event.set()   #创建标志位,变成绿灯count = 0else:print("\033[42mgree light is on ....\033[0m")time.sleep(1)count += 1def car(name):"车子"while True:if event.is_set():   #有标志位,代表是绿灯print("{0} running ....".format(name))time.sleep(1)else:   #代表红灯print("{0} sees red light ,waiting ....".format(name))event.wait()   #阻塞print("\033[32mgreen light is on , start going ...\033[0m")light = threading.Thread(target=lighter,)
light.start()car1 = threading.Thread(target=car,args=("car1",))
car1.start()

2.3、红绿灯另外一个例子

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

import threading,time
import random
def light():if not event.isSet():event.set() #wait就不阻塞 #绿灯状态count = 0while 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 = 0event.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()

2.4、员工进公司刷卡

说明:员工进公司门要刷卡, 我们这里设置一个线程是“门”, 再设置几个线程为“员工”,员工看到门没打开,就刷卡,刷完卡,门开了,员工就可以通过。

 1 import threading
 2 import time
 3 import random
 4
 5 def door():
 6     door_open_time_counter = 0
 7     while True:
 8         if door_swiping_event.is_set():
 9             print("\033[32;1mdoor opening....\033[0m")
10             door_open_time_counter +=1
11
12         else:
13             print("\033[31;1mdoor closed...., swipe to open.\033[0m")
14             door_open_time_counter = 0 #清空计时器
15             door_swiping_event.wait()
16
17
18         if door_open_time_counter > 3:#门开了已经3s了,该关了
19             door_swiping_event.clear()
20
21         time.sleep(0.5)
22
23
24 def staff(n):
25
26     print("staff [%s] is comming..." % n )
27     while True:
28         if door_swiping_event.is_set():
29             print("\033[34;1mdoor is opened, passing.....\033[0m")
30             break
31         else:
32             print("staff [%s] sees door got closed, swipping the card....." % n)
33             print(door_swiping_event.set())
34             door_swiping_event.set()
35             print("after set ",door_swiping_event.set())
36         time.sleep(0.5)
37 door_swiping_event  = threading.Event() #设置事件
38
39
40 door_thread = threading.Thread(target=door)
41 door_thread.start()
42
43
44
45 for i in range(5):
46     p = threading.Thread(target=staff,args=(i,))
47     time.sleep(random.randrange(3))
48     p.start()
49
50 员工刷卡

员工刷卡

转载于:https://www.cnblogs.com/xiangjun555/articles/7665927.html

event(红绿灯例子)相关推荐

  1. event红绿灯实例

    import threading,time event=threading.Event() #生成一个event对象def lighter():     count=0     event.set() ...

  2. 线程的语法 (event,重要)

    Python threading模块 2种调用方式 直接调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import threading impo ...

  3. python之event【事件】

    # 线程之间用于交互的一个对象,这个event是一个内部的标签,线程可以等待这个标签的状态 #举个例子,比如红绿灯是一个线程,三辆汽车是3个线程,如果为红灯,则三个汽车的线程必须 #要停止,如果是绿灯 ...

  4. python用input输入列表有缺陷_Python 三程三器的那些事

    装饰器 1.什么是装饰器 装饰器本质是函数,用来给其他函数添加新的功能 特点:不修改调用方式.不修改源代码 2.装饰器的作用 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 装饰器必 ...

  5. jQuery,Ajax.animate,SVG(简要学习笔记二十)[完结篇]

    1.$和jquery在全局命名空间中定义的唯一两个变量. 2.jquery是工厂函数,不是构造函数.他返回一个新创建的对象. 3.jquery的四种调用方式:     <1>传递CSS选择 ...

  6. 一文搞定JS事件基础与进阶

    1.事件简介 2.事件的调用方式         在script标签中使用         在元素中调用 3.鼠标事件         鼠标点击         鼠标移入移除         鼠标按住 ...

  7. 连续性的设计——改善产品的体验

    "当一个人过马路的时候,他在斑马线上是从马路的一端,走到另一端." · 我们可以观察到这个过程的变化. "种子.发芽.最后开花." · 种子到开花的过程我们很少 ...

  8. Flume Sink

    一 HDFS Sink 将event写入HDFS. 1.1  RequiredProperties channel:从哪一个channelpull数据 type:hdfs hdfs.path:HDFS ...

  9. web 端JS取得window 的按键动作(按下Shift, Alt,Ctrl....)

    如何取得 基本上都是从动作的event 中去判断. IE下的处理 在IE中, window 对象里就有包含event. 看例子: <!--Add by oscar999--> <!D ...

最新文章

  1. 强势安利7个广受好评的软件!助你一臂之力!
  2. Facebook开源NLP建模框架PyText,从论文到产品部署只需数天
  3. NIO详解(三):IO多路复用模型之select、poll、epoll
  4. 【正一专栏】春日随感—赢在起跑线上
  5. mysql记录相互关系查询_MySQL关系表查询两个表的数据
  6. Python Django中,页面改变但链接地址没有跳转,解决方法
  7. linux 终端 朗读,使Linux终端朗读文字的小技巧分享
  8. ArcGIS 代理产品价格以及折扣表、产品描述
  9. H G W S哪一个不是状态函数_HAWE哈威BVH11H/M/S/2-X24换向阀
  10. 为什么博客园安卓端无法登陆,真服了
  11. java的set和get方法实例化_java反射机制 调用get set 方法 | 学步园
  12. c# DateTime常用用法
  13. 解决ORA-27103:internal error错误一例
  14. 第二章 驱动程序调测方法与技巧
  15. Docker存储驱动之总览
  16. showdoc修改json转表格格式
  17. 学会宽容您的世界会很美丽
  18. 531 孤独像素 I
  19. 计算机缺少网络连接,电脑提示找不到宽带连接的原因及解决方法
  20. linux创建用户命令-----useradd

热门文章

  1. 讯飞语音开发之语音唤醒
  2. 树莓派 --- 使用snowboy实现语音唤醒功能
  3. 微信如何定时发消息?微信定时群发详细步骤
  4. php如何美化表格,Excel表格总是做得不好看?简单5步美化表格,老板看了都加工资...
  5. JAVA程序设计2018_重庆大学网院2018年Java程序设计 ( 第1次 )
  6. 华为HD 6.5.1.7版本 hbase region分裂问题
  7. jquery on() ajax 首次没反应,为什么JQuery的ajax方法没有执行
  8. win10开发者选项安装linux,开启开发者模式后卡在真在安装开发者模式程序包
  9. wpscan常见的使用方法
  10. kafka入门:简介、使用场景、设计原理、主要配置及集群搭