2019/12/20 04线程同步之Event

本文探讨了多线程在高并发场景下的应用,重点介绍了Event机制作为线程间通信的有效手段,通过内部标记的状态变化实现线程同步,避免资源冲突,提高程序效率。

在这里插入图片描述
多个线程一起跑,是一种并行的方式来解决并发的解决方案,高并发就需要多个线程来解决问题,多线程使用要注意,等于打饭开多个窗口,但是窗口后面的资源各是各的,就是局部变量或者thread。local
(进程是资源管理和分配的,是线程的容器)进程是国与国的关系,进程内的资源是共享(相当于,多个窗口打饭,后厨只有一个,一会炒肉,一会炒菜)
或者多个人写文件,这样就有事情,归谁写,如果资源紧俏,总有这样的现象,这样就必须使用线程同步技术(用线程间的协同,要线程一起协调工作,通过某一种技术,让一个线程访问某些数据的时候,其他线程不干扰它,直到该线程结束对数据操作

解决线程同步有很多方式,
在这里插入图片描述

event

必须掌握,event是线程间通信机制中最简单的实现,使用一个内部的标记flag,通过flag的true或false的变化来进行操作,刚才也成为开关量,0和1
在这里插入图片描述
**set可以当作0和1,1就是true,0就是false
**在这里插入图片描述
清楚标记
在这里插入图片描述
是true还是false
在这里插入图片描述
none就是无限等待,直到等到状态变化为true,超时了还没有等到标记,就返回false在这里插入图片描述在这里插入图片描述
老板要看,工作是否做好了,工人只需要做,造好的杯子,放在一个容器里
这里面产生了一个状态变化,做完了,就没必要做,break,顺便把flag把状态改变
在这里插入图片描述
里面的flag=true,相当于赋值即重新定义,就要使用global,全局变量在这里插入图片描述在这里插入图片描述
现在开启两个线程,这就是最传统写法在这里插入图片描述
boos那边需要break一下
在这里插入图片描述
另起一个用event来改造一下,Event是一个类,可以从threading导入,创建event实例
在这里插入图片描述
event()默认标记是false,现在e.set()可以理解为变成true了
boss就可以经过很大的改造
在这里插入图片描述
主线程,和boos和worker线程各自做各自的
worker生产到满足要求,就是状态的变化e.set
boss线程就一直在阻塞等你在做完,等event信息变化,得到变化后,执行下面的print语句
在这里插入图片描述在这里插入图片描述在这里插入图片描述
现在是永久阻塞,如果不是永久阻塞就不是这么写了在这里插入图片描述
写event可以解决之前用全局变量来解决的一些事情
在这里插入图片描述在这里插入图片描述
这就是如何去完成生产杯子的问题,现在是通过event状态变化来通知BOSS的
在这里插入图片描述
用的是同一个event,工人完成了,boss也就知道了,如果用的不是同一个event,就不相干了,如果要让其他人知道你的变化,就需要同一个event
在这里插入图片描述
这样用同一个event实例才有用
在这里插入图片描述
谁wait就要等到变化,如果到超时时间还没有变化,说明没有等到,就返回false
在这里插入图片描述
两个boss都等着也没有问题,这就是无限定等待状态的个数在这里插入图片描述
引用wait后,wait一旦返回,如果是永久阻塞,返回,说明达到条件,set过了
在这里插入图片描述
两种可能
1如果是设定时间,等到时间还没返回,就返回false
2.没有设定时间,返回true,说明set过了
在这里插入图片描述
如果给定时长,等到了,说明set
创建线程对象,并直接SET

在这里插入图片描述
wait方法(int ),代表等多久
主线程是等10秒,才会至1
工作线程,是3秒一次,3次3秒的时候,就是true,就打印,do sth,打印3次
主线程到达10秒,先要退出,但是另外工作线程是none-daemon,就需要等到12秒左右,没有设定daemon,就从主线程集成none-daemon

在这里插入图片描述
上面的说法是不对的,wait会等到set为止,前提是不超时得到set,所以上面的描述是有问题的,工作线程set以后,置1了,轮到工作线程就不要wait了,提前返回,打印三次,就直接跳出循环了,线程结束在这里插入图片描述
运行试试,三次结束
允许试试
wait是在超时时间内,看看set,如果一直没等到set,就只能超时,抛出异常,直接返回false

同一个event,可以在工作线程用,也可以在主线程用,用同一个event,代表观察 同一个对象的变化在这里插入图片描述
event的wait是优于time。sleep,,sleep用系统调用的话,等待时间会更长,wait的等待时间稍微短一些,所以切换线程的频率就会很快,效率好像高一些,python官方建议使用wait,sleep一般测试用,多线程实际使用都是event,用event的目的就是为了等待状态的变化
event好处就是可以等待状态的变化,大家都听着这个状态变成你想要的状态,这是好处,省的用全局变量来做这个事情,只要是同一个event对象就可以了,不管在哪个线程里用
在这里插入图片描述在这里插入图片描述
能不能写一个timer类,不继承thread,用event写延时执行的类,不继承thread,就没有start,就需要自己写一个start

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值