zoukankan      html  css  js  c++  java
  • 理解Node.js的事件轮询

    前言

    总括

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

    正文

    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是博主平时积累的一些代码。包括凝视,汇总成了一个小应用,还是能够看到学习的蛛丝马迹的。感兴趣的您能够看看。

    后记

    參考文章:

  • 相关阅读:
    Oracle常用命令大全(很有用,做笔记)
    表格驱动编程在代码中的应用
    mac 利用svn下载远程代码出现Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
    FAILURE: Build failed with an exception.
    There is an internal error in the React performance measurement code.Did not expect componentDidMount timer to start while render timer is still in progress for another instance
    react native TypeError network request failed
    Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)
    react-native Unrecognized font family ‘Lonicons’;
    react-native SyntaxError xxxxx/xx.js:Unexpected token (23:24)
    Application MyTest has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.
  • 原文地址:https://www.cnblogs.com/llguanli/p/8453648.html
Copyright © 2011-2022 走看看