首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每日一问11-线程使用场景(Node.js,Redis ,Memcached)

每日一问11-线程使用场景(Node.js,Redis ,Memcached)

作者头像
早起的鸟儿有虫吃
发布2021-01-18 11:47:42
发布2021-01-18 11:47:42
7030
举报
文章被收录于专栏:算法之美算法之美

问题:线程使用场景

这里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存储是加锁的,因此命令执行简化理解为单线程处理

重点:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档