• python 并发编程 多线程 event


    event实现了一个线程通知另外一个线程

    线程的一个关键特性是每个线程都是独立运行且状态不可预测。

    1.为什么要使用Event对象:

    如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。

    2.Event对象实现原理

    对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为Fasle。如果有线程等待一个Event对象, 而这个Event对象的标志为Fasle,那么这个线程将会被一直阻塞直至该标志为真。

    一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行

    from threading import Event
    
    event.isSet():返回event的状态值;
    
    event.wait():如果 event.isSet()==False将阻塞线程;
    
    event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
    
    event.clear():恢复event的状态值为False 清空

     

    event应用

    from threading import Thread
    from threading import Event
    import time
    
    event = Event()
    
    def student(name):
        print("学生%s 正在听课" % name)
        # 学生听课在等待命令下课
        event.wait()
    
        # 收到下课信号 学生去活动
        print("学生%s 课间活动" % name)
    
    def teacher(name):
        print("老师%s 正在授课" % name)
        time.sleep(7)
    
        print()
        # 老师发送下课信号,学生也收到
        event.set()
    
    if __name__ == "__main__":
        stu1 = Thread(target=student,args=("小马",),)
        stu2 = Thread(target=student,args=("小红",),)
        stu3 = Thread(target=student,args=("小刚",),)
    
        t1 = Thread(target=teacher,args=("mike",),)
    
        stu1.start()
        stu2.start()
        stu3.start()
        t1.start()
        
    '''
    
    学生小马 正在听课
    学生小红 正在听课
    学生小刚 正在听课
    老师mike 正在授课
    
    学生小马 课间活动
    学生小红 课间活动
    学生小刚 课间活动
    '''

    event.wait(2)  参数可以设置超时时间 秒数

    过了这个时间,即使没有收到信号,都可以活动

  • 相关阅读:
    Oracle基础(二)之排序(order by)、限定查询(where)
    Python文件操作
    Python基础二
    Python基础一
    Linux系统学习之 三:新手必须掌握的Linux命令3
    Linux系统学习之 二:新手必须掌握的Linux命令2
    Linux系统学习之 一:新手必须掌握的Linux命令1
    Centos7.5虚拟机无法ping通网关、外网IP地址
    记一次mybatis的坑
    关于正则的那些事儿
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/11069445.html
Copyright © 2020-2023  润新知