00:01
单reactor多线程。请同学们看这张图。这张这张图呢,就是我们单reactor多线程的。原理图同学们可以从这里可以看到哈,我们这边怎么样呢?就是reactor,它在一个主线程运行。对,那么如果说有了一个业务处理,他会干什么呢?他在这里面会把这个真正的业务处理干什么,转发或者说分派给我们worker线程池里面的一个worker线程及处理线程。那这张图呢,就是反映了单reactor多线程的运行的机制,我们现在对这张图做一个说明,把它理理梳理一下,来看一下啊,同学们。首先我们看一下它这个是怎么来的呢?来一步步走。Reactor reactor对象,我们就也就说这个对象就这里react对象他干什么呢?通过。
01:07
他通过这个select,是不是这有个select方法呀。Select。就是我们对这个图说明通过select监控什么呀,对我们来说一下监控。他监控什么呢?客户端监控客户端请求事件。请求事件没有问题吧,就他坚信请求事件,那这个请求事件可能是建立连接,也有可能是一个具体的处理请求,那这样子呢,他就会分别的进行处理收到。收到事件后。收到事件后干什么呢?通过通过dispatch。Dispatch dispatch,我刚要dispatch dispatch进行分发。分发,这是它的基本的一个规则,那接着我们继续往下看。
02:03
继续往下看,如果就是这条线,我们来说一下这条线,如果是建建立连接的请求,如果是建立建立连接请求。好,如果是建立连接的请求,我就干什么呢?则则由这边有一个就是我们的接收器,就是我简写啊ACC。Eptr就是由这个accept干什么呢?通过。通过什么呀,通过accept。Accept的处理,处理连接请求。连接请求。那连接请求会干什么呢?会创建同时啊,就是他把这个连接请求呃,拿到过后,肯定是会跟我们的客户端产生一个连接嘛,这是肯定的,然后同时呢,然后。
03:01
然后干什么呢?创建这写个,然后创建。就写错了。创建它,创建一个handler。创建一个handler对象,处理什么呀?处理,处理完成。完成请呃完成处理连接后处理完成完就是用handle对象处理完,完成连接后的,连接后的。呃,各种事件。各种事件,诶他就是干这个事情的,那这条线说完了之后,我们接着来看,如果如果这次不是什么呢,大家看。如果不是连接请求。就他这次来的不是连接请求,我们又怎么处理呢?则则由。
04:00
由。有reactor。有我们这个react对象干什么呢?会。分发分发。分发调用调用连接。连接对应的handler,对handler来响应。或者来处理都可以。就是你事先的这个之间的连接已经建好了,如果,如果你在这次client来了过后,不是一个连接请求,而是要进行一个业务处理,那么我就去干什么呢?由这个reactor把它分发到呃,跟这个连接关联的这个handler。来进行处理,明白这意思吧,好,紧接着我们继续往找handler,他就干什么呢?注意看,我们现在先说一下这个handler handler只负责,他负责的是。或者叫只负责写清楚,他只负责响应事件。
05:02
他只负责响应事件。对,他只负责响应事件,不做看清楚了啊,他不去做具体的。具体的业务处理。业务处理。这样子呢,就不会让我们这个程序长时间的在这个地方进行一个阻塞,因为。说的再简单一点,就是说你的业务处理花费的时间可能会很长,也有可能你这个业务处理是一个IOIO操作,对吧?那么怎么样呢?我这个handle只负责响应事件,不做具体的业务处理,我们现在在说的是单reactor多线程啊。啊,就说要理解,不做具体的业务处理,那他干什么呢?他是这样子的,他通过RAID方法。通过read。他通过read读取数据后。读取数据后。干什么呢?会分发会分发,他也分发。
06:00
分发给后面的,后面的什么呀,Worker线程。就是这个worker线程词,线程词。线程池的某个线程某个处理某个线程吧处理业务。就这样子的,也就是说他在这边把这个呃数据读到以后呢,他就干什么呢,他把这个真正要干的事情,把因为读到数据是我们业务处理需需要的嘛,把数据也传给我们这一个worker线程池里面的某一个线程,让他去处理,那处理完了过后又怎么办呢?不着急,接着往下看,就worker线程。Worker线程池。线程池会分配,就是这个worker线程池有个功能,它会分配什么,分配一个独立的线程。就是我们所说的。这个真正的work线程了,对吧,它会分配一个独立的线程处理完成或者叫完成真正的业务。
07:07
真正的业务。注意,还有一句话很重要,同时把这个业务处理过后的结果返回给汉德。病。并将什么呢?结果返回,返回给谁呀?返回给handler,注意听清楚,也就是说这个数据的,呃,最后把这个标给颜色吧。这样这个颜色有了,大家就看到,看的清晰点。我我这个往这边挪一点好吧,不影响。好,他会把就是这个线程,就是我们worker现在池里面的一个独立的worker线程,会把这个业务处理完毕,处理完毕过后呢,这这地方少了一条线,但是呢,大家应该可以理解,就这个结果还是要返回给我们这个handle德,Handle德再通过这个删的方法呢,呃通过呃,Handle德的这个handle的肯定会持有,或者这handle肯定会持有跟这个可端的一个连接吧,然后他把这个通过这个善呢,把这个信息发给对应的这个C,只是这条线呢,这没画而已,大家不要说诶怎么没有回声的这条线,你要这样去看图的话,这个图就没法看了。
08:13
对吧,有些东西他没画出来,大家能够理解啊,就说他肯定这个散的,不会再通过这个RA给你发回去吗?他肯定直接就散了回去了,明白我意思吧,因为这个handle肯定会持有或者能够得到跟它对应的呃的一个连接或者是一个通道,对不对,好,他会把。这个就是这边这个线程呢,Worker线程会把嗯,处理的结果返回给handler,下一步大家知道什么handleler。收到响应后,收到响应后他干什么呢?通过a send。通过善将相结果将结果。结果返回给兰。到此就结束了。这就是我们的单reactor多线程的一个模型,同学们可以看到它这里呢?
09:05
呃,很明显哈,就说至少有一个特别好的地方,就是我我们在处理这个多个可能的请求的时候,我们可以把这个业务,因为业务处理是最费时间的嘛。对不对,业务处理是最费时间的,所以说我把这个业务处理呢,交给一个线程去处理,处理完了过后,我这里把这个结果再发回去就完了,至少拆解了一部分。拆解了一个最费时的,呃嗯,这个逻辑或者是业务到。一个独立线程。那同学们肯定会想,诶,那是老师不对呀,那要是这个地方handle,那要是特别多handle这方又阻塞了,把这个react主先生又阻塞了,怎么办呢?不着急,同学们,既然我们说到有单regard多线程,肯定还有其他方式,我们一步一步来好不好,因为整个这个它这个就是我们所说的编这个这个线程模型,它本身也经历了这样一个过程,所以说单react呢,它就是这样来处理的。
10:04
那么我们来分析一下它的优点和它的缺点又有哪些呢?简单的聊两句,我们看优点吧,优点是至少我们可以看到它的原先的单react单线程里面,它提升了一点,就是可以充分的。它可以充分。它可以充分地干什么呀?利用利用多核。多核CPU。CPU的处理能力,这个没问题吧,因为你大家可以先看这个图。至少我这边有多个线程呢,对不对,我有多个线程来跑,那当然如果你是多核的,呃,你这个这个电脑是多核的,我就会充分发挥多核CPU的处理能力,但是缺点呢,呃,我们也要分析一下,就是小型面试官问到你,呃多线程,大家看到他这个多线程。
11:02
我们往这去,多线程它会数据共享。数据共享和访问比较复杂,为什么你想想你现在这边有多个线程呢?那如果说涉及到一些数据的共享或者是访问,肯定会出现这个资源的竞争呢,或者是相关的同步异步的问题,是不是你都要去处理啊,肯定比原先的单个线程要复杂一些了,而而而且呢,大家可以看到还有一个问题就是reactor,这个reactor它承担或者是处理了它处理所有的什么呀,所有的事件请求。事件A。事件。它处理。这个react单单react它处理的所有的事件的监听。监听和响应。
12:01
对不对,它的监听,那么在单线程运行中,它在单线程。单线程运行,它是在单线程运行的,大家有没有发现这个是在一个单线程运行的。那么在单线程运行呢,干什么呢?在高并发应用场景容易出现瓶颈干什么呀,在高并发。高并发。高并发场景。场景容易。容易出现瓶颈。性能瓶颈,我们在写写写全一点啊,性能瓶颈。好的,那同学们其实也根据这句话,其实你们也可以理解啊,一个为什么能理解呢?你想虽然说你现在把业务处理分配到了,或者分发到了worker线程,但是毕竟你这一个主线程去监听了,或者响应了很多这个客户的一个连接请求,你都要走走这条线嘛,刚开始走这条线,那你你你你你首先要把它拿到过后,你要判断是连接还是什么,如果是连接,你是不是要创建相应的这个。
13:09
呃,通道或者是连接,然后如果它发送的不是呃,不是一个呃连接请求,而是一个业务请求,是不是你handler也是运行在这个主线层的。那他还是有毒。读的问题还是有三个问题,只是呢,他在原先的基础上把这个业务处理分发下去了,所以说当这个高并发就可端很多的时候呢,我们这个handler,你多个handler还是运在同一个呃线程的,还是出容易出现瓶颈,大家明白我的意思吧,因此这个结论就这样来的,就是多线程数据共享和访问比较复杂,Re处理所有的事件的监听和响应在单,它是在单线程运行的,那么在高密发应用场景容易出现瓶颈,好同学们,那这个呢,就是我们单线程,呃单reactor多线程的模式的讲解,大家看一下,它的优点和它缺点都能说出来。
我来说两句