zoukankan      html  css  js  c++  java
  • 并发编程之Event事件

    Event事件

    用来同步线程之间的状态。

    举个例子:

    ​ 你把一个任务丢到了子线程中,这个任务将异步执行。如何获取到这个任务的执行状态

    解决方法:

    1. 如果是拿到执行结果 我们可以采用异步回调,
    2. 在这里我们采用另外一种方法来做:Event
    Event事件

    第一阶段:采用轮询方式去获取线程状态

    """a线程的任务是:开启服务器,需要3秒钟;b线程的任务是:连接服务器,直到连接成功为止"""
    from threading import  Thread
    import time
    
    is_boot = False
    
    # 开启服务器
    def start_server():
        global  is_boot
        print("starting server......")
        time.sleep(3)
        print("server started!")
        is_boot = True
    
    # 连接服务器
    def connect_server():
        while True:
            if is_boot:
                print("连接服务器成功")
                break
            else:
                print("失败,服务器未启动!")
            time.sleep(0.5)
    
    
    t1 = Thread(target=start_server)
    t2 = Thread(target=connect_server)
    
    t1.start()
    t2.start()
    
    starting server......
    失败,服务器未启动!
    失败,服务器未启动!
    失败,服务器未启动!
    失败,服务器未启动!
    失败,服务器未启动!
    失败,服务器未启动!
    server started!
    连接服务器成功
    

    由此可以看出“连接服务器”函数,非常消耗资源。在多线程中,如果我们要实现等服务器开启完的那一刻,我们再连接上去,这样就能一次性完成连接,这时我们就使用Event事件来完成

    第二阶段:采用Event事件

    from threading import  Thread,Event
    import time
    
    # 创建事件
    e = Event()
    print(e._flag)
    # 开启服务器
    def start_server():
        print("starting server......")
        time.sleep(3)
        print("server started!")
        e.set()         # 状态从False 变为 True
        print(e._flag)
    
    
    # 连接服务器
    def connect_server():
        e.wait()        # 等待事件从 false 变为true,当状态发生变化即可执行下面代码
        if e.is_set():
            print("连接成功")
    
    t1 = Thread(target=start_server)
    t2 = Thread(target=connect_server)
    t1.start()
    t2.start()
    
    False
    starting server......
    server started!
    True
    连接成功
    
  • 相关阅读:
    Codeforces Round #260 (Div. 2)
    面试题:给定数组a,找到最大的j-i, 使a[j]>a[i]
    ssh自动输入密码脚本 切换目录脚本
    make工作时的执行步骤
    Codeforces Round #259 (Div. 2)
    Codeforces Round #258 (Div. 2)
    如何在半径为1的圆中随机选取一个点
    面试中常问的有关随机选取k个数的总结
    topcoder SRM 628 DIV2 BracketExpressions
    topcoder SRM 628 DIV2 BishopMove
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11140106.html
Copyright © 2011-2022 走看看