并发编程之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
连接成功
posted @ 2019-07-05 18:50  Hello_Jack  阅读(191)  评论(0编辑  收藏  举报
# 页脚html代码 /*头部导航栏*/ #navigator { font-size:15px; border-bottom: 1px solid #ededed; border-top: 1px solid #ededed; height: 60px;/*导航栏高度,原始50*/ clear: both; margin-top: 25px; } /*导航栏设置,可以自定义导航栏的目录*/ #navList { min-height: 35px; float: left; } #navList li { /*每一个栏目节点*/ float: left; margin: 0 5px 0 0; /*这里原来是0 40px 0 0 */ } #navList a { /*栏目文字的格式*/ display: block; width: 5em; height: 22px; float: left; text-align: center; padding-top: 19px; }