• Nodejs的运行原理-调用篇


    前言

    之前做过Nodejs的架构篇, 有很多朋友留言给我,说没看懂里面的例子,这里我会重新梳理一下,再以http server为例,来解析Nodejs从前端到libuv的调用过程。

    正文

     

    回忆a. Nodejs提供了许多功能接口(又称标准库),例如:http,net,socket etc

    回忆b. 这些库是由C/C++写成,并且对外提供服务

    回忆c. libuv负责异步调用工作(event loop)

    这是上一篇我们使用过得流程图,从V8角度出发,描述了建立http server,js 到C/C++的过程,同时也包括了调用后端的参与者(tcpwrap,libuv)。图中1,2,3,4,5这些步骤是一个同步调用的过程,始于server.listen(),终于第5步,也就是server.listen()之后。

    server.listen()发起的请求不一定会被处理完,V8会继续执行js代码。

    当server.listen()发起的请求被处理完之后,libuv发起一个逆向的callback,始于libuv中的event loop,终于server中设置的callback函数,而这期间,V8可能已经完成了多条任务(小心回调地狱),这就是异步的优势所在。

    PS:高并发不等同于高效率,我们以Nodejs的食堂为例,窗口阿姨调度得当,他很快地将饭菜分给学生,这不代表学生能够马上吃到饭,因为学生要慢慢地找到空闲的位置才能开始吃饭。(这里稍微吐槽下,Nodejs的运算速度比PHP5还要慢,不适合做逻辑复杂的项目)

    一个简单的http server 例子:

    var http=require("http");
    http.createServer(function(req,res){ 
    res.writeHead(200,{ "content-type":"text/plain" }); 
    res.write("hello nodejs"); 
    res.end(); 
    }).listen(3000);

    几行代码便可跑起一个http server,看似简单,背后肯定发生了很多故事。

    我们来看下图,从createServer开始分析。

    从上至下可分为两部分:

    第一部分=创建一个server实例,这部分还是集中在js部分,其中http.js,http_server.js以及net.js为Nodejs库中的代码,这部分比较重要的细节是net.js,集成了若干API,这些API会为之后提供服务。

    第二部分=从调用this.listen()开始,可以清楚地看到,第二部分直接调用net.js提供的api。createTCP()通过 process.binding('tcp_wrap').TCP 进入到Nodejs C/C++部分,也就是图2 TCPWrap部分。在回来net.js的倒数第二步,handle.open(fd),这部分代码最终调用到C/C++部分的TCPWrap::Open()。

    看完了这篇文章,是不是更清晰地了解Nodejs的运行原理了!

  • 相关阅读:
    解决App can’t be opened because it is from an unidentified developer
    Mac之当前目录打开终端
    Mac之安装zsh
    毕业论文之降低重复率
    Latex之希腊字母表 花体字母 实数集
    latex之插入数学公式
    好句收集
    Python之两个列表一起打乱
    Python之时间统计
    Python之正则表达式
  • 原文地址:https://www.cnblogs.com/peiyu1988/p/8253074.html
Copyright © 2020-2023  润新知