python之event【事件】
# 线程之间用于交互的一个对象,这个event是一个内部的标签,线程可以等待这个标签的状态
#举个例子,比如红绿灯是一个线程,三辆汽车是3个线程,如果为红灯,则三个汽车的线程必须
#要停止,如果是绿灯,则三个汽车的线程就可以跑起来 import threading #创建一个事件
event = threading.Event() #如果标签没有设置,则线程会一直等待,直到标签的状态被设置,如果设定了标签,则这里的
#wait就不阻塞了,该动作什么都不做,如果没有设置,则该wait这里就一直阻塞,无论有多线程
#都可以等待一个事件
# event.wait() #设定标签和清空标签
event.set()
event.clear() #下面是一个红绿灯例子,很有意思
# import threading
# import time
# import random
# def light():
# #定义了一个灯的函数
# if not event.is_set(): #如果事件未定义,则设置该标签,设置该标签,则如果有线程在等待这个标签,就不会出现阻塞,也就是说初始状态是绿灯
# event.set()
# count = 0
# while True:
# if count < 10:
# #如果事件小于10,则不对事件做任何处理
# print("\033[42;1m----green light on----\033[0m")
# elif count < 15:
# #如果事件小于15,则不对事件做任何处理
# print("\033[43;1m----yellow light on----\033[0m")
# elif count < 20:
# #如果事件小于20,也就是说如果时间在15和20之间,则进入红灯状态,如果是红灯状态,则汽车就要阻塞,要实现阻塞,我们就需要对事件设置状态
# if event.is_set():
# event.clear()
# print("\033[41;1m----red light on----\033[0m")
# else:
# count = 0
# event.set()
# time.sleep(1)
# count += 1
#
# def car(n):
# while 1:
# time.sleep(1)
# if event.is_set():
# #如果事件设置了状态,则后面的语句不阻塞,照常执行
# print("cat [%(name)s] is running" %{"name":n})
# else:
# event.wait()
# #如果这个时间没有设置状态,则该事件一直阻塞在这里,等待该事件被设置状态
# print("cat [%(name)s] is wait for red light" % {"name": n})
#
# if __name__ == '__main__':
# event = threading.Event()
# Light = threading.Thread(target=light)
# Light.start()
# for i in range(3):
# t = threading.Thread(target=car,args=[i,])
# t.start()
# import threading
import time
import random # 1、我们先定义一个灯的函数,由灯的线程去调用这个函数,绿灯是允许通过,红灯是不允许通过,其中绿灯10s,红灯也是10s,这里我们就要用到事件
# 如果是绿灯,我们则设置事件的状态,如果是红灯,我们则取消事件的状态,初始状态为红灯
def light():
if event.is_set():
#设置初始状态,该初始状态为事件没有状态,则进程一直会阻塞
event.clear()
count = 0
while True:
#进入交通灯灯循环的状态
if count < 10:
print("\033[41;1m----red light on----\033[0m")
elif count < 20:
print("\033[42;1m----green light on----\033[0m")
if not event.is_set():
event.set()
else:
pass
else:
count = 0
if event.is_set():
event.clear()
count += 1
time.sleep(1) def car(n):
while True:
time.sleep(1)
if event.is_set():
print("car [%(name)s] is running" %{"name":n})
else:
print("car [%(name)s] is waiting for red light" % {"name": n})
event.wait() # 2、我们在定义一个车的函数,由车的线程去调用这个函数 if __name__ == '__main__':
light_thread = threading.Thread(target=light)
light_thread.start()
for i in range(3):
t = threading.Thread(target=car, args=[i,])
t.start()
python之event【事件】的更多相关文章
- Python多线程-Event(事件对象)
Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...
- python之event事件
同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测.如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手.为了解决这些问题,我们需 ...
- Python 36 死锁现象和递归锁、信号量、Event事件、线程queue
一:死锁现象和递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁
ps:python解释器有很多种,最常见的就是C python解释器 GIL全局解释器锁: GIL本质上是一把互斥锁:将并发变成串行,牺牲效率保证了数据的安全 用来阻止同一个进程下的多个线程的同时执行 ...
- [Python 多线程] Timer定时器/延迟执行、Event事件 (七)
Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...
- Python 中Semaphore 信号量对象、Event事件、Condition
Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...
- 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue
gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...
- Python线程event
python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait.clear.set 事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 e ...
- saltstack之salt event事件用法
event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统.每个event都有一个标签.事件标签允许快速制定过滤事件.除了标签 ...
随机推荐
- 用两条命令看出你买的H3C光模块是否是正品
display transceiver manuinfo interfacedisplay transceiver interface从下文可以看出 1/0/26 1/0/27 2/0/26三个端口的 ...
- 如何使用沙箱测试单笔转账到支付宝账号(php版) https://openclub.alipay.com/read.php?tid=1770&fid=28
说明: 本帖是利用支付宝沙箱测试电脑网站支付接口 测试环境:Apache2.4.23 +php 5.6.25 沙箱环境测试正式环境请修改网关为下方值 复制代码 1 正式环境网关:htt ...
- php表达式
表达式是PHP中一个重要的概念,可以把表达式理解为“任何有值的东西”.在本教程中涉及到表达式的语法,我们以“expr”来表示表达式. 下面就是一个表达式: $x > $y; 在上面的例子中,当$ ...
- SpringBoot入门篇--热部署
在项目的开发过程中我们难免会涉及到对代码的修改,有bug我们也需要对代码进行修改,这时候我们就需要重启服务器.但是,我们知道的是这个过程是相当的痛苦的,重启服务器涉及到了所有资源的重新加载,过程那是相 ...
- Petapoco 查询 语法
查询语句 Sql sql = Sql.Builder; sql.Select("spb_MailAddress.*") .From("spb_MailAddress&qu ...
- Python之模块(一)
模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少 ...
- Bogart gSub.vb
'--------------Job No 0900408 -------------- '--DIM PART ONE ONLINE Update Order Qty '''主要新加過程名 Refr ...
- tensorboard启动图
import tensorflow as tf # 定义一个简单的计算图,实现向量加法的操作. input1 = tf.constant([1.0, 2.0, 3.0], name = 'input1 ...
- ANA网络分析
ANN网络分析 Mnist手写数字识别 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据 ...
- uva-208-枚举-并查集
题意: 给你一个图,从1到指点的点有多少种不同的路径,用了并查集剪枝,如果当前节点的根不是指定的节点,直接返回,会超时 time limit了俩次,wa了俩次,PE俩次 #include <io ...