
多个线程一起跑,是一种并行的方式来解决并发的解决方案,高并发就需要多个线程来解决问题,多线程使用要注意,等于打饭开多个窗口,但是窗口后面的资源各是各的,就是局部变量或者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
本文探讨了多线程在高并发场景下的应用,重点介绍了Event机制作为线程间通信的有效手段,通过内部标记的状态变化实现线程同步,避免资源冲突,提高程序效率。

被折叠的 条评论
为什么被折叠?



