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都有一个标签.事件标签允许快速制定过滤事件.除了标签 ...
随机推荐
- Work01
7101:我是最酷的张绥:我的爱是弹吉他,唱歌,游泳,打篮球...: 我的博客是:https://www.cnblogs.com/Mrzs/ 我的码云个人主页是:https://gitee.com/s ...
- 技巧:利用putty通过win7访问ubuntu
.用apt-get直接安装SSHD服务所需相关软件包: sudo apt-get install openssh-server .开启服务: sudo /etc/init.d/sshd start p ...
- Delphi7到Delphi XE2的升级历程
1.PChar 转为PAnsiChar; 2.第三方控件的安装 SuiPack不能直接点击InStall.exe安装,需要打开DPK文件安装: SuiPack安装之后程序编译会报错,resHandle ...
- 使用minGW/cygwin在Windows是用于gcc开发
刚才记录了下用eclipse在linux下开发,突然想起来也另一种方法:MinGW. MinGW是Windows的gcc开发工具,直接使用Windows的运行库,所以可以在windows下面方便的用g ...
- 开发组件:Systemd
Systemd 入门教程:命令篇 http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
- selenium+python自动化87-Chrome浏览器静默模式启动(headless)
前言 selenium+phantomjs可以打开无界面的浏览器,实现静默模式启动浏览器完成自动化测试,这个模式是极好的,不需要占用电脑的屏幕. 但是呢,phantomjs这个坑还是比较多的,并且遇到 ...
- linux case ${variable} in
脚本实现划分考试等级层次;
- pythone--002
元组就是不可修改: 字典的索引不是自增的. 元组和列表是: 默认 是key 通过get 没有这个key 是none get可以有默认值: 通过索引 没有就报错. 检查字典中某个可以是否存在:ha ...
- style css
Title 语文 用户名 用户名 数学 英语 <!DOCTYPE html><html lang="en"><head> <meta ch ...
- gevent 实现io自动切换,gevent.join([]), gevent.spawn, 爬虫多并发的实现
gevent 是一个第三方库,可以很容易的实现遇到io(文件传输)操作时,程序自动跳转到下一个程序 例一: 用gevent.sleep() 来模拟io操作 import gevent def foo ...