python-threading.Event实现事件功能

enent可以通过设置、等待、清除一个标识(flag),来进行线程间的控制
线程可以通过获取这个标志位(flag)的状态(设置或未设置)来控制线程
事件其实就相当于一个全局变量(设置为True,未设置为False),线程通过这个全局变量的状态来控制自身
event只要set,clear,wait三个方法
使用前先实例化event = threading.Event()
event.wait()#线程阻塞,等待标志位被设置
event.set()#设置标志位
event.clear()#清除标志位
enent.isSet()#标志位是否被设置

红绿灯事件模型,设置一个全局event,红绿灯进程按照时间改变event值,车辆进程根据event值作出相应动作。

import threading
import time,random
event = threading.Event()
#set为绿灯,clear为红灯
def light():
    count = 0
    if not event.isSet():
        event.set()#设置初始状态为绿灯
    while True:
        if count <10:
            #绿灯
            print('\033[1;42;1m绿灯-可以通行 %s\033[0m'%count)
            event.set()
        elif count <13:
            #黄灯
            print('\033[1;43;1m黄灯 %s\033[0m' % count)

        elif count <25:
            #红灯
            print('\033[1;41;1m红灯-禁止通行 %s\033[0m' % count)
            event.clear()
        else:
            count = 0
            event.set()
        count +=1
        time.sleep(1)

def car(n):
    while True:
        time.sleep(1)#random.randrange(3)
        if event.isSet():#绿灯状态
            print('car[%s] is running...'%str(n))
            #event.wait()
        else:
            print('car[%s] is waitting ...'%str(n))
            event.wait()#阻塞等待标志位被设定

def main():
    t_light = threading.Thread(target=light)
    t_light.start()
    for i in range(3):
        t_car = threading.Thread(target=car,args=(i,))
        t_car.start()

main()

原文地址https://www.cnblogs.com/limich/p/7477079.html

python-threading.Event实现事件功能--汽车过红绿灯(转载)的更多相关文章

  1. python之event【事件】

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

  2. Python多线程的threading Event

    Python threading模块提供Event对象用于线程间通信.它提供了一组.拆除.等待用于线程间通信的其他方法. event它是沟通中最简单的一个过程之中,一个线程产生一个信号,号.Pytho ...

  3. Python多线程-Event(事件对象)

    Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...

  4. python学习笔记——创建事件对象Event

    1 Event对象的基本概述 用 multiprocessing.Event 实现线程间通信,使用multiprocessing.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到 ...

  5. python线程的同步事件Event

    Event对象: 用于线程间的通信,某个线程需要根据其他线程的状态来判断自己的下一步操作. Event内部定义了一个全局变量:_flag,默认为False. 当_flag = False时,会阻塞当前 ...

  6. Python基础之多线程事件Event

    import threading,time class Boss(threading.Thread): def run(self): print("BOSS:伙计们今晚上加班到22:00&q ...

  7. Python threading(多线程)

    threading模块在较低级别thread模块之上构建更高级别的线程接口. 一.threading模块定义了以下函数和对象: threading.active_count() 等同于threadin ...

  8. 后台程序处理(二) python threading - queue 模块使用

    由于协程没办法完成(一)中所说的任务模式 接下来就尝试一下使用线程和队列来实现一下这个功能 在实现之前,我们先明确一个问题--python的线程是伪并发的.同一时间只能有一个线程在运行.具体怎样的运作 ...

  9. python threading.thread

    Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对 ...

随机推荐

  1. java.io.IOException: Could not find status of job:job_1534233312603_0002

    hive执行插入数据操作 报错: 在hive console里面输入: set  hive.jobname.length=20; 再次执行好了:

  2. SpringMVC+AJAX+JSON

    在做一个ajax发送json到springmvc的控制层,控制层的对象中有一个List集合,ajax调用总是报415错误.发现了一个一直没有注意到的问题,借机记录一下. (细节部分都忽略了,在最后的d ...

  3. 模板模式(TemplateMethod)

    什么是Template Method模式 在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Mehtod模式.模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可 ...

  4. C/C++ -- Gui编程 -- Qt库的使用 -- 使用图片与动画

    QWidget工程 #include "mywidget.h" #include "ui_mywidget.h" #include <QLabel> ...

  5. 快速搭建gulp项目实战

    gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码,而且大 ...

  6. AndroidStudio报错Software caused connection abort: recv failed

    Software caused connection abort: recv failed 这个问题网上有一种说法 已知会导致这种异常的一个场景如下: 客户端和服务端建立tcp的短连接,每次客户端发送 ...

  7. 10-hdfs-hdfs搭建

    hdfs的优缺点比较: 架构图解分析: nameNode的主要任务: SNameNode的功能: (不是NN的备份, 主要用来合并fsimage) 合并流程: dataNode的主要功能: HDFS上 ...

  8. MVC下拉框Html.DropDownList 和DropDownListFor 的常用方法

    一.非强类型:Controller:ViewData["AreId"] = from a in Table                               select ...

  9. [转]Gridview实现多列排序,并显示图标

    本文转自:http://blog.csdn.net/gmjinrong/article/details/4516301 GridView实现支持多列排序,并显示升.降序图标上网找了很多资料参考才解决了 ...

  10. oracle 报错归纳总结

    1.ORA-00904 正常情况下是找不到字段(大概率字段名字错了) 还有一种比较特别的情况实在设计DB的时候,字段小写,在sql查询工具自动提示的时候都是大写,造成字段找不到的情况.