Python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set,通过Event来实现两个或多个线程间的交互。

事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么执行event.wait 方法时便不再阻塞。

  • clear:将“Flag”设置为False
  • set:将“Flag”设置为True

  用 threading.Event 实现线程间通信,使用threading.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到线程对象中。Event默认内置了一个标志,初始值为False。一旦该线程通过wait()方法进入等待状态,直到另一个线程调用该Event的set()方法将内置标志设置为True时,该Event会通知所有等待状态的线程恢复运行。

事件是一个简单的同步对象,该事件表示一个内部标志和线程可以等待标志被设置,或者自己设置或清除标志。

  • event = threading.Event()#客户端线程可以等待标志被设置
  • event.wait() #服务器线程可以设置或重置它
  • event.set() #如果该标志已设置,则等待方法不会执行任何操作。
  • event.clear()#如果标志被清除,等待将被阻塞,直到它再次被设置。

任何数量的线程都可能等待相同的事件。

举例:

下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红灯停,绿灯行的规则。

import threading
import time,randomevent = threading.Event()def lighter():count = 0event.set() #先设置绿灯while True:if count > 5 and count < 10 : #改成红灯event.clear() #把标注位清空print("\033[41;1m red light is on...\033[0m")elif count > 10:event.set() #变绿灯count = 0else:print("\033[42;1m  green  is on...\033[0m")time.sleep(1)count += 1def car(name):while True:time.sleep(random.randrange(10))if event.is_set(): #设置标志位代表绿灯print("[%s] running ..." % name )else:print("[%s] sees red light , waiting ..." % name )event.wait()print ("\033[34;1m[%s] green light is on ,start going ...\033[0m" % name)light = threading.Thread(target=lighter,)
light.start()
for i in range(3):#假设有4台机器,编号从0 - 3 ,随机抽取car1 = threading.Thread(target=car,args=(i,))car1.start()
输出:green  is on...
[0] running ...green  is on...green  is on...
[0] running ...green  is on...green  is on...green  is on...
[2] running ...red light is on...
[1] sees red light , waiting ...red light is on...red light is on...
[0] sees red light , waiting ...red light is on...green  is on...
[1] green light is on ,start going ...
[0] green light is on ,start going ...green  is on...

参考大王的例子

import threading,time
import random
def light():if not event.isSet():event.set() #设置标志位,wait就不阻塞,为绿灯状态count = 0while True:if count < 5:print('\033[42;1m--green light on---\033[0m')elif count < 8:print('\033[43;1m--yellow light on---\033[0m')elif count <15:if event.isSet():event.clear()print('\033[41;1m--red light on---\033[0m')else:count = 0event.set() #count归零,重新设置标志位,打开绿灯time.sleep(1)count +=1
def car(n):while 1:time.sleep(random.randrange(10))if  event.isSet(): #设置标志位,表示绿灯print("car [%s] is running.." % n)else:print("car [%s] is waiting for the red light.." %n)
if __name__ == '__main__':event = threading.Event()Light = threading.Thread(target=light)Light.start()for i in range(1,5):t = threading.Thread(target=car,args=(i,))t.start()


广告,插入Timer函数讲解

Timer函数讲解

   类表示只有经过一段时间才应该运行的动作,定时器和线程一样,通过调用它们的start()方法来启动。通过调用cancel()方法可以停止计时器(在其动作开始之前)。计时器在执行其动作之前等待的时间间隔可能与用户指定的时间间隔不完全相同。举例:
import threading
def hello():print("hello world")t = threading.Timer(30,hello) #30为等待的时间,按秒计算
t.start()
输出:
hello world

转载于:https://www.cnblogs.com/chen170615/p/8761768.html

13、第七 - 网络编程基础 - Python中协程EVENT()函数-事件函数相关推荐

  1. 【Python】【入门篇】十二、Python中协程

    目录 十二.Python中协程 12.1 协程的定义 12.2 协程 12.3 协程池 12.4 总结 十二.Python中协程 12.1 协程的定义 协程(Coroutine):是一种比线程更加轻量 ...

  2. python中协程与函数的区别_python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  3. python中协程与函数的区别_深入浅析python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  4. python绝对导入_[编程基础] Python中的绝对导入与相对导入

    如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句.即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想对P ...

  5. Python 函数式编程,Python中内置的高阶函数:map()、reduce()、filter()与sorted(),Python中返回函数

    函数式编程 是一种编程范式,比函数更高层次的抽象. 函数式编程将计算视为函数而非指令. 纯函数式编程:不需要变量,没有副作用,测试简单. 支持高阶函数,代码简洁. Python 支持的函数式编程 不是 ...

  6. [转载] Python中协程的详细用法和例子

    参考链接: Python中的协程 从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数.可是,在协程中, yield 通常出现在表达式的右边(例如, datum = yield), ...

  7. python中协程实现的本质以及两个封装协程模块greenle、gevent

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为 ...

  8. python中协程的理解_python协程的理解

    一.介绍 什么是并发? 并发的本质就是切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制): 1.任务发生阻塞 2.计算任务时间过长,需要让出cpu给高 ...

  9. python中协程与函数的区别_python协程和异步IO

    1.并发.并行.同步.异步.阻塞.非阻塞 并发:是指在同一个时间段内,有几个程序都处于启动运行到运行结束之间 并行:在同一个时间点上,有几个程序同时运行 同步:当一个同步操作发出去后,调用者一直等待返 ...

  10. python协程库_python中协程的详解(附示例)

    本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...

最新文章

  1. winForm调用HTTP短信接口
  2. TabControl控件和TabPage
  3. 在Hyperopt框架下使用XGboost与交叉验证
  4. 中国靶材行业需求前景分析及发展形势研究报告2021版
  5. 8/100. Find All Numbers Disappeared in an Array
  6. Unity基础知识学习笔记二
  7. python 爬取_使用 Python 和 BeautifulSoup 来做爬虫抓取
  8. python读取ini文件
  9. AIX系统内存占用率的计算
  10. 读《Unity 5.x 游戏开发指南》
  11. 天猫商城多幅图片并排展示广告效果,鼠标指向高亮其它阴影
  12. 微信小程序底部导航栏中间突出
  13. java gdal开源库_基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版
  14. WebApi 下载文件流?
  15. [RPI]关于树莓派3B+的AV接口(RCV)
  16. Ava 自动化测试----对函数的简单测试和对Http接口的测试
  17. 数据挖掘需要什么数学基础(一)
  18. python的xlrd读取Excel数据失败: raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+‘; not supported‘) ...
  19. 毕业设计第8周学习记录
  20. VB6.0人脸识别(使用虹软人脸识别SDK)

热门文章

  1. 探秘联想台北研发中心 扒一扒system x是如何炼成的?
  2. MySQL · 性能优化 · SQL错误用法详解
  3. 软件测试(三)——lab 1
  4. Excel两列数据比较,相同的保存在另外一列
  5. SDRAM学习笔记(二)
  6. http协议-响应和请求
  7. 数据结构(四)之冒泡排序
  8. android 文件加密源码
  9. Linux上查到目前透过FTP进来的使用者
  10. 我中招了:解喝汽水问题