并发编程之Event事件
Event事件
用来同步线程之间的状态。
举个例子:
 你把一个任务丢到了子线程中,这个任务将异步执行。如何获取到这个任务的执行状态
解决方法:
- 如果是拿到执行结果 我们可以采用异步回调,
- 在这里我们采用另外一种方法来做: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
连接成功
并发编程之Event事件的更多相关文章
- python并发编程之gevent协程(四)
		协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ... 
- python并发编程之asyncio协程(三)
		协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ... 
- 并发编程之J.U.C的第二篇
		并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类 ... 
- [转载]并发编程之Operation Queue和GCD
		并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ... 
- Java并发编程之CAS
		CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ... 
- 并发编程之wait()、notify()
		前面的并发编程之volatile中我们用程序模拟了一个场景:在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程 ... 
- 并发编程之 Exchanger 源码分析
		前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange -- 交换器.用于 ... 
- 并发编程之 Condition 源码分析
		前言 Condition 是 Lock 的伴侣,至于如何使用,我们之前也写了一些文章来说,例如 使用 ReentrantLock 和 Condition 实现一个阻塞队列,并发编程之 Java 三把锁 ... 
- python并发编程之Queue线程、进程、协程通信(五)
		单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ... 
随机推荐
- C语言特点有哪些?
			C语言的特点 : 1.简洁紧凑.灵活方便 C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示.它把高级语言的基本结构和语句与低级语言的实用性结合起来. C 语言可以象汇编语言一 ... 
- Dart语言学习(八) dynamic
			dynamic 表示是动态的,数据类型是指任意类型 var a; a = ; a = "Dart"; print(a); dynamic b = ; b = "JavaS ... 
- 集合转换为数组toArray(),数组转换为集合asList()
			package seday12; import java.util.ArrayList;import java.util.Arrays;import java.util.Collection; /** ... 
- IOS上给body和html绑定click事件的坑
			场景: 在ios上(包括iPhone和ipad) 给window ,html,document,body绑定click事件,点击不会触发 由于ios浏览器都用的safari内核,所以ios浏览器全部中 ... 
- Mysql架构、复制类型、复制功能介绍
			1.1 常见的几种主从架构 一主一从 一主多从 多主一从 双主互备 1.2 主从复制功能 1)实时灾备 2)读写分离 3)高可用 4)从库数据统计 5)从库数据备份 6)平滑升级 1.3 三种复制方式 ... 
- Kakfa概述及安装过程
			一.概述 1. Kafka是由LinkedIn(领英)开发的一个分布式的消息系统,最初是用作LinkedIn的活动流(Activity Stream)和运营数据处理的基础 a. 活动流数据包括页面访问 ... 
- zookeeper的安装(单机版)
			一.获取zookeeper的安装包 zookeeper的官网下载:wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zo ... 
- 战争游戏OverTheWire:Bandit(一)
			一个用来熟悉linux命令的游戏: Level0 告诉我们使用ssh连接网址,用户名和密码皆为bandit0.使用Xshell或者linux连接都可以 我使用的是Xshell5: Level0-> ... 
- 【原】Django常用命令总结
			1.终端命令 # 查看django版本 $ python -m django --version # 创建项目,名为mysite $ django-admin startproject mysite ... 
- ➡️➡️➡️IELTS Listening
			目录 src numbers and letters src https://ielts-simon.com/ielts-help-and-english-pr/ielts-listening/ nu ... 
