Even事件

时间:2019-12-13
本文章向大家介绍Even事件,主要包括Even事件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Even事件

1,定义

  • 同进程的一样 ,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行

  • import time
    from threading import Thread, current_thread, Event
    event = Event()
    
    
    def check():
        print(f'{current_thread().name}监测服务器是否开启')
        time.sleep(1)
        print(event.is_set())
        event.set()
        print(event.is_set())
        print('服务器已经开启')
    
    
    def connect():
        print(f'{current_thread().name} 等待连接')
        event.wait()
        #event.wait(1)  # 只阻塞1秒,1秒之后如果还没有进行set 直接进行下一步操作.
        print(f'{current_thread().name}连接成功')
    
    
    if __name__ == '__main__':
        t1 = Thread(target=check,)
        t2 = Thread(target=connect,)
        t1.start()
        t2.start()
    #######################################
    Thread-1监测服务器是否开启
    Thread-2 等待连接
    False
    True
    服务器已经开启
    Thread-2连接成功
  • 实例
    from threading import Thread
    from threading import current_thread
    from threading import Event
    import time
    
    event = Event()
    def check():
        print(f'{current_thread().name} 监测服务器是否开启...')
        time.sleep(4)
        event.set()
        print('服务器已经开启...')
    
    def connect():
        count = 1
        while not event.is_set():
            if count == 4:
                print('连接次数过多,已断开')
                break
            event.wait(1)
            print(f'{current_thread().name} 尝试连接{count}次')
            count += 1
        else:
            print(f'{current_thread().name} 连接成功...')
    
    t1 = Thread(target=check,)
    t2 = Thread(target=connect,)
    t1.start()
    t2.start()
    ################################
    Thread-1 监测服务器是否开启...
    Thread-2 尝试连接1次
    Thread-2 尝试连接2次
    Thread-2 尝试连接3次
    连接次数过多,已断开
    服务器已经开启...
    ################################
    服务器睡3秒以下
    Thread-1 监测服务器是否开启...
    Thread-2 尝试连接1次
    Thread-2 尝试连接2次
    服务器已经开启...
    Thread-2 尝试连接3次
    Thread-2 连接成功...

原文地址:https://www.cnblogs.com/daviddd/p/12034447.html