Event事件

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

举个例子:

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

解决方法:

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

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

  1. """a线程的任务是:开启服务器,需要3秒钟;b线程的任务是:连接服务器,直到连接成功为止"""
  2. from threading import Thread
  3. import time
  4. is_boot = False
  5. # 开启服务器
  6. def start_server():
  7. global is_boot
  8. print("starting server......")
  9. time.sleep(3)
  10. print("server started!")
  11. is_boot = True
  12. # 连接服务器
  13. def connect_server():
  14. while True:
  15. if is_boot:
  16. print("连接服务器成功")
  17. break
  18. else:
  19. print("失败,服务器未启动!")
  20. time.sleep(0.5)
  21. t1 = Thread(target=start_server)
  22. t2 = Thread(target=connect_server)
  23. t1.start()
  24. t2.start()
  1. starting server......
  2. 失败,服务器未启动!
  3. 失败,服务器未启动!
  4. 失败,服务器未启动!
  5. 失败,服务器未启动!
  6. 失败,服务器未启动!
  7. 失败,服务器未启动!
  8. server started!
  9. 连接服务器成功

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

第二阶段:采用Event事件

  1. from threading import Thread,Event
  2. import time
  3. # 创建事件
  4. e = Event()
  5. print(e._flag)
  6. # 开启服务器
  7. def start_server():
  8. print("starting server......")
  9. time.sleep(3)
  10. print("server started!")
  11. e.set() # 状态从False 变为 True
  12. print(e._flag)
  13. # 连接服务器
  14. def connect_server():
  15. e.wait() # 等待事件从 false 变为true,当状态发生变化即可执行下面代码
  16. if e.is_set():
  17. print("连接成功")
  18. t1 = Thread(target=start_server)
  19. t2 = Thread(target=connect_server)
  20. t1.start()
  21. t2.start()
  1. False
  2. starting server......
  3. server started!
  4. True
  5. 连接成功

并发编程之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. PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    $test=$_POST["test"]; $test= preg_replace("/(\n)|(\s)|(\t)|(\')|(')|(,)/" ,',' , ...

  2. BT详解,BT原理

    请参考以下链接: https://www.cnblogs.com/EasonJim/p/6601146.html

  3. Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址

     OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...

  4. 用Eclipse+Maven+Jetty构建Java Web开发环境(详细笔记)

    (软件环境) 『系统』Windows 10 x64 『JAVA』JDK 1.8.0_91 『Eclipse』 Eclipse-oxygen 『Maven』 apache-maven-3.6.3 『Je ...

  5. Django - 美化显示request.META

    def index(request): values = request.META.items() html = [] for k, v in values: html.append('<tr& ...

  6. 深度学习之反向传播算法(BP)代码实现

    反向传播算法实战 本文仅仅是反向传播算法的实现,不涉及公式推导,如果对反向传播算法公式推导不熟悉,强烈建议查看另一篇文章神经网络之反向传播算法(BP)公式推导(超详细) 我们将实现一个 4 层的全连接 ...

  7. (VLAN)理解Hybrid接口的应用

    实验三:理解Hybrid接口的应用 实验原理: 实验内容: 某企业二层网络使用两台S3700交换机S1和S2,且两台设备在不同的楼层.网络管理员规划了3个不同VLAN, HR部门使用VLAN 10,市 ...

  8. CF-----Pillars

    . Pillars There are n pillars aligned in a row and numbered from 1 to n. Initially each pillar conta ...

  9. Color the ball(差分数组)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  10. java处理节假日和工作时间的工具类

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; impo ...