美文网首页
【Python】用事件Event管理线程threading

【Python】用事件Event管理线程threading

作者: 焜_8899 | 来源:发表于2023-05-25 11:40 被阅读0次

    0. 背景

    写了段涉及多线程的程序,但并不想要个别线程一直执行。希望能在有需要的时候唤醒它们,不需要的时候让它们阻塞。感觉事件比较满足想要的效果。

    事件对象

    这是线程之间通信的最简单机制之一:一个线程发出事件信号,而其他线程等待该信号。

    1. 事件

    官方文档对事件对象的解释清晰明了:

    一个事件对象管理一个内部标识,调用 set() 方法可将其设置为 true ,调用 clear() 方法可将其设置为 false ,调用 wait() 方法将进入阻塞直到标识为 true 。

    更为详细的内容请移步官方文档

    2. 用法

    2.1 代码示例

    以下代码演示了用事件管理线程的一种方式。其中event.set()event.clear()可以被用在需要触发相关事件的地方,例如按钮。

    import threading
    import time
    
    event = threading.Event()  # 实例化事件对象
    
    
    def print_1():  # 第一个线程的调用对象
        while True:
            event.wait()  # 阻塞线程直到被唤醒
            print(1)
            time.sleep(1)
    
    
    def print_2():  # 第二个线程的调用对象
        while True:
            print(2)
            time.sleep(1)
    
    
    if __name__ == '__main__':
        # 开始线程活动
        threading.Thread(target=print_1).start()
        threading.Thread(target=print_2).start()
    
        while True:
            print('event.set()')
            event.set()  # 唤醒被阻塞的线程
            time.sleep(5)
    
            print('event.clear()')
            event.clear()  # 阻塞线程
            time.sleep(5)
    
    

    2.2 运行效果

    以下为上述代码的运行效果。可以看到,每过5秒,输出1的线程会被阻塞或唤醒一次。

    2
    event.set()
    1
    12
    
    12
    
    12
    
    12
    
    event.clear()
    2
    2
    2
    2
    2
    event.set()
    1
    2
    1
    2
    1
    2
    1
    2
    1
    2
    event.clear()
    2
    2
    2
    2
    2
    event.set()
    1
    2
    1
    2
    1
    2
    1
    2
    1
    2
    event.clear()
    2
    2
    2
    2
    2
    event.set()
    1
    2
    1
    2
    

    相关文章

      网友评论

          本文标题:【Python】用事件Event管理线程threading

          本文链接:https://www.haomeiwen.com/subject/cokhedtx.html