
问题:线程使用场景
这里Node.js,Redis ,Memcached 为例子 采用相同过得线程模型。
一句话描述:单线程循环处理业务,多线程并发IO读取。
让计算和io可以相互重叠。

end
一线一循环(loop) +多线程(io消耗多处理io,cpu消耗多处理cpu)

Reactor 多线程模型的特点:io线程,work线程。
1)有专门一个 NIO 线程 -Acceptor 线程用于监听服务端,接收客户端的 TCP 连接请求;
2)网络 IO 操作 - 读、写等由一个 NIO 线程池负责,线程池可以采用标准的 JDK 线程池实现,它包含一个任务队列和 N 个可用的线程,由这些 NIO 线程负责消息的读取、解码、编码和发送;【瓶颈 耗时比较多】
3)1 个 NIO 线程可以同时处理 N 条链路,但是 1 个链路只对应 1 个 NIO 线程,防止发生并发操作问题。
Node:


适合什么业务:

cpu 与io是互斥的


什么是异步IO 不是按照代码顺序执行的

多线程实现:



上面可能没看懂,这里重点解释:核心点
Node 主线程是"单线程",那为何能同时处理万级并发而不造成阻塞呢

例子:看10遍
https://segmentfault.com/a/1190000005173218
例子:看10遍 实际看了3次
https://juejin.cn/post/6844903692752142343

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这样设计的方案主要源于其语言特性,因为 JavaScript 是浏览器脚本语言,它可以操纵 DOM ,可以渲染动画,可以与用户进行互动,如果是多线程的话,执行顺序无法预知,而且操作以哪个线程为准也是个难题。
作者:鬼鬼鬼 链接:https://juejin.cn/post/6844903692752142343 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有 "任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
所以,当在执行过程中遇到一些类似于 setTimeout 等异步操作的时候,会交给浏览器的其他模块进行处理,当到达 setTimeout 指定的延时执行的时间之后,回调函数会放入到任务队列之中
你选择哪个:我选择那个


对比实现:
node: 主循环处理业务,多线程处理IO

redis6.0
可能是我机器太渣了,3线程比单线程的QPS提升有120%~140%,网友测试的在4线程下QPS提升了100%。




Memcached: hash存储是加锁的,因此命令执行简化理解为单线程处理


重点:
