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
连接成功

并发编程之Event事件的更多相关文章

  1. python并发编程之gevent协程(四)

    协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...

  2. python并发编程之asyncio协程(三)

    协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...

  3. 并发编程之J.U.C的第二篇

    并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类 ...

  4. [转载]并发编程之Operation Queue和GCD

    并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...

  5. Java并发编程之CAS

    CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ...

  6. 并发编程之wait()、notify()

    前面的并发编程之volatile中我们用程序模拟了一个场景:在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程 ...

  7. 并发编程之 Exchanger 源码分析

    前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange -- 交换器.用于 ...

  8. 并发编程之 Condition 源码分析

    前言 Condition 是 Lock 的伴侣,至于如何使用,我们之前也写了一些文章来说,例如 使用 ReentrantLock 和 Condition 实现一个阻塞队列,并发编程之 Java 三把锁 ...

  9. python并发编程之Queue线程、进程、协程通信(五)

    单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...

随机推荐

  1. Adobe PS

    1. ctrl + Tab  切换视图窗口 2.shift 拖拽图片,将 2 张图片放在一起 3.切换显示方式 /全屏/带有工具栏 快捷键:F 4. 缩小/放大工具 快捷键: alt + 鼠标滑轮 5 ...

  2. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  3. [转]工作量证明(PoW)权益证明(PoS)和委任权益证明(DPoS)区别

    原文链接 Both in the glossary and in some of our previous posts we've touched on mining and the two main ...

  4. 吴裕雄 人工智能 java、javascript、HTML5、python、oracle ——智能医疗系统WEB端智能分诊代码简洁版实现

    <%-- Document : getInfo Created on : 2018-10-7, 21:36:37 Author : acer --%> <%@page import= ...

  5. css 中 max-width 和 min-width 的区别

    max-width:规定元素本身最大宽度,即元素本身 (该div) 的宽度应小于等于其最大宽度值. min-width:规定元素本身最小宽度,即元素本身应大于等于其宽度值. 例:min-width:1 ...

  6. Amoeba介绍及原理

    Amoeba的中文意思是变型虫 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库 ...

  7. hadoop学习笔记(二):hdfs优点和缺点

    优点 其中的10k+,指的是每一个块必须>=1M 缺点 低延迟:是指hadoop处理数据都是以分钟为单位的,而不像storm那样的是以毫秒级为单位的. 高吞吐率:是指你分布式存储的文件块的大小必 ...

  8. HITCON-Training-master 部分 Writeup(1月30更新)

    0x01.lab3 首先checksec一下,发现连NX保护都没开,结合题目提示ret2sc,确定可以使用shellcode得到权限. IDA查看伪代码 大致分析: 将shellcode写入name数 ...

  9. 同步I/O和异步I/O

    同步I/O包括:阻塞,非阻塞,多路复用 阻塞模型:给你送的外卖到了,给你打电话,你不去取,外卖小哥一直在那等你,直到你来,形成阻塞,当然应该给外卖小哥点赞,哈哈哈哈!! 非阻塞模型:取外卖的主人非常饿 ...

  10. 从数据库中取数据(Stalberg.TMS.Data)

    using System; using System.Data; using System.Data.SqlClient; namespace Stalberg.TMS { //*********** ...