目录
线程池引言
池分类
池化优势
用在何处
线程池组件
任务队列
线程队列
线程池
Reactor分解
何为Reactor
Reactor组件
网络IO处理分解
Reactor抛入线程池的方式
充分利用多核CPU,主从Reactor
面试项目书写小技巧 (文末彩蛋)
缓冲, 重复利用, 大大减少重建, 节约资源, 提高效率, 提高利用率
核心优势在哪里?
线程队列:
提前开启线程,
多线程同步消费任务队列中的任务
多线程同步消费:加锁 + 条件消费, 同步等待, 一个线程需要消费必须同时具备两个条件, 1.获取锁 2. 满足条件 (存在任务)
同步:核心在于条件等待, 等待着一个条件满足,然后同步触发一个事件, 阻塞函数, 同步等待.
同步优势:对于共享资源的有序消费, 多线程之间互相等待, 互相同步, 稳定消费
也可叫做阻塞队列: blocking queue 学名
阻塞队列作用:异步解耦合, 任务放入任务队列中, 立刻返回, 在工作线程繁忙的时候,不至于需要等待线程空闲.
组织成双向队列的多线程. 工作线程, 消费者线程, 提前开启, 等待处理任务
生活实例:办事窗口
将上述两大组件组合在一起 + mutex锁 + cond条件变量 实现同步消费
反应堆, 事件反应堆, 反射堆: 将对io的操作封装成对事件的操作
single reactor thread + worker threadpool
单线程reactor + 工作线程池
做法: 将业务逻辑处理单独抛入一个工作线程池进行处理. 实现网络IO跟业务的解耦合
使用场景: 相比IO, 业务逻辑处理耗时相当严重. 比如说写日志呀, XML 文件的解析、数据库记录的查找、文件资料的读取和传输、计算型工作的处理等,它们会拖慢整个反应堆模式的执行效率。此时我们就可以将其单独抛到另外的Thread pool 中去执行业务需求.
好处:反应堆线程仅仅处理网络IO 而 decode、compute、enode 型工作放置到另外的线程池中, 两者解耦,在业务处理耗时情况下大大提高效率
单Reactor的时候, reactor 反应堆同时分发Acceptor 上的连接建立事件和已建立连接的 I/O 事件。这样对于客户端接入量不高的情况下是完全OK的.
但是一旦客户端接入量特别大的情况下, reactor既要分发连接建立,又分发已建立连接的 I/O,有点忙不过来,在实战中的表现可能就是客户端连接成功率偏低。
引出 --- 主从Reactor模式, 多Reactor模型, 将 acceptor 上的连接建立事件和已建立连接的 I/O 事件分离
核心思想: main Reactor只负责分发连接建立事件, sub Reactor 来负责已经建立连接的事件的分发.
sub Reactor的数量设置: 依据CPU数量而定
优势:服务器稳定性大大提升, 客户端连接成功率大大提高
对比书写, 分版本书写, 不同的版本优势是什么, 加入了什么技术, 带来了什么样的好处, 获益是什么
eg:本文中的reactor.
我在简历项目上书写, 实现了一个多线程reactor网络服务器框架
最开始使用什么样的技术, 实现了单线程reactor的框架, 然后对比单线程reacor跟多线程reactor, 表明加入线程池 + 主从reactor之后的优势所在. 带来了什么样的提升, 服务器稳定性提升呀, 性能抗压性提升等. (此处仅为小杰己见, 可能会有益处)
如下是我在网上找到的一个大佬写的单Reactor + 线程池的实现, 我觉得写的很棒, 其中的代码很多都是特别值得我们去品味的
reactor: 一个使用c语言实现的“单Reactor多线程”的简易reactor模型。https://gitee.com/chenwifi/reactor