码迷,mamicode.com
首页 > Web开发 > 详细

理解Node.js的事件轮询

时间:2018-02-19 12:18:44      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:文章   csdn   loop   tle   http   img   概念   pop   汇总   

前言

总括

智者阅读群书。亦阅历人生

正文

Node.js的两个基本概念

Node.js的第一个基本概念就是I/O操作开销是巨大的:

技术分享图片

所以,当前变成技术中最大的浪费来自于等待I/O操作的完毕。有几种方法能够解决性能的影响:

  • 同步方式:按次序一个一个的处理请求。:简单。:不论什么一个请求都能够堵塞其它全部请求。
  • 开启新进程:每一个请求都开启一个新进程。:简单;:大量的链接意味着大量的进程。
  • 开启新线程:每一个请求都开启一个新线程。:简单,并且跟进程比。对系统内核更加友好。由于线程比进程轻的多;:不是全部的机器都支持线程,并且对于要处理共享资源的情况,多线程编程会非常快变得太过于复杂。

第二个基本概念是每一个连接都创建一个新线程是非常消耗内存的(比如:你能够对照Nginx回忆一下Apache内存耗尽的情景)。

Apache是多线程的:它为每一个请求开启一个新的线程(或者是进程,这取决于你的配置),当并发连接增多时。你能够看看它是怎么一点一点耗尽内存的。Nginx和Node.js不是多线程的,由于线程的消耗太“重”了。

它们两个是单线程、基于事件的。这就把处理众多连接所产生的线程/进程消耗给消除了。

单线程

确实仅仅有一个线程:你不能并行运行不论什么代码。比方:以下的“sleep”将会堵塞sever1秒钟:

function sleep() {
   var now = new Data().getTime();
   while (new Date().getTime() < now + 1000) {
         // do nothing
   }
}
sleep();

但就我眼下学习阶段而言,我认为好多人对于所谓的node单线程是有误解的。实际上官方给出的“单线程”是具有误导性的。所谓的单线程是指你的代码仅仅运行在一个线程上(好多地方都叫它主线程。实际上Javascript的浏览器运行环境不也是这么处理我们写的Javascript代码的嘛),而诸多任务的并行处理,就须要多线程了,例如以下图:

技术分享图片

如上图,Node.js中的单线程之说指的就是这个主线程。这个主线程有一个循环结构。保持着整个程序(你写的代码)的运转。

事件轮询

事实上上面我们所说的维持主线程运行的循环这部分就是”事件轮询”,它存在于主线程中,负责不停地调用开发人员编写的代码。但对开发人员是不可见的。so…开发人员编写的代码是如何被调用的呢?看下图:

技术分享图片

如上图,异步函数在运行结束后。会在事件队列中加入一个事件(遵循先进先出原则),主线程中的代码运行完毕后(即一次循环结束),下一次循环開始就在事件队列中”读取”事件,然后调用它所相应的回调函数(所以回调函数的运行顺序是不一定的)。假设开发人员在回调函数中调用了堵塞方法(比方上文中的sleep函数),那么整个事件轮询就会堵塞,事件队列中的事件得不到及时处理。正由于这样,nodejs中的一些库方法均是异步的,也提倡用户调用异步方法。

var fs = require(‘fs‘);
fs.readFile(‘hello.txt‘, function (err, data) {  //异步读取文件
  console.log("read file end");
});
while(1)
{
    console.log("call readFile over");
}

如上代码,我们尽管使用了异步方法readfile读取文件,但read file end永远不会输出。由于代码始终在while循环中。下一次事件轮询始终没法開始,也就没法’读取’事件队列调用相应的回调函数了。

最后有一个Node-sample是博主平时积累的一些代码。包括凝视,汇总成了一个小应用,还是能够看到学习的蛛丝马迹的。感兴趣的您能够看看。

后记

參考文章:

理解Node.js的事件轮询

标签:文章   csdn   loop   tle   http   img   概念   pop   汇总   

原文地址:https://www.cnblogs.com/llguanli/p/8453648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!