节点中事件循环的解决方案 射流研究…
当我们知道I/O操作和创建新线程的成本巨大时!
网站延迟的成本
对于一个网站来说,我们的大部分程序大部分时间都在读I/O,后台没有复杂的计算。
看到一条数据:IO操作可能比数据处理慢几个数量级。高端SSD固态硬盘读取速度可达200 MB-700 MB/s;读取1000字节需要1.4微秒。在此期间,频率为2GHZ的CPU可以执行28000个指令处理周期。而且网络数据的IO更慢!
NodeJS采用单线程无阻塞架构,解决了长期存在的IO问题
当使用多线程时,会为每个请求打开一个新线程(Apache就是这么做的)。当并发增加时,线程消耗会非常严重。
什么是阻塞和非阻塞?
阻塞调用意味着在返回调用结果之前,当前线程将被挂起。调用线程在得到结果之前不会返回。非阻塞调用意味着调用不会阻塞当前线程,直到不能立即获得结果。
var fs=require(' fs ');fs.readFile('。/testfile ',' utf8 ',函数(错误,文件){ if(错误)引发错误;Console.log('我已经读完了文件!');});Console.log('我不会被阻止!' );用node执行下面的代码会输出我不会被阻塞,然后输出我已经读完了文件
阿志虎的回答:
你打电话给书店老板,问他有没有《分布式系统》这本书。如果你在阻止模式下打电话,你会一直上吊,直到你得到这本书的结果。如果你在非阻塞模式下打电话,不管老板有没有告诉你,你都会先去打。当然,你应该偶尔检查一下老板是否在几分钟内返回结果。
节点的事件轮询
这是节点可以处理大并发和高吞吐量的核心,尽管它是一个单线程。事件轮询有以下三个组成部分
事件队列:这是一个先进先出模型的队列。一方推事件,另一方推出事件队列的读轮询线程组件,也就是主角Event Loop,一个单独的线程池,用来执行长任务(也就是线程池,节点底层,用c写,不会阻塞)
在nodejs中,只有一个主线程(也就是上面提到的单线程)持续读取轮询(在book中称为调用I/O observer)队列中是否有事件。
对于读取文件,HTTP
请求等。(现代cpu处理能力强,事件处理相当快,导致I/O中运行速度下降的瓶颈),在这个单线程中容易被阻塞。
执行肯定会造成拥塞,所以事件循环
这种类型的事件将被交给底层线程池执行,当线程池运行时,回调函数将被赋予线程池
阻塞任务完成后,结果将与回调函数一起放入轮询队列。
摘要
以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。
版权声明:节点中事件循环的解决方案 射流研究…是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。