前言

之前做过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的运行原理了!

Nodejs的运行原理-调用篇的更多相关文章

  1. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  2. Nodejs的运行原理-架构篇

    前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理. PS:此系列只做Nodejs的运行 ...

  3. Nodejs的运行原理-libuv篇

    前言 这应该是Nodejs的运行原理的第7篇分享,这篇过后,短时间内不会再分享Nodejs的运行原理,会停更一段时间,PS:不是不更,而是会开挖新的坑,最近有在研究RPG Maker MV,区块链,云 ...

  4. Nodejs的运行原理-科普篇

    前言 Nodejs目前处境稍显尴尬,很多语言都已经拥有异步非阻塞的能力.阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接收生成好的数据,然后或渲染后,或直接发送到 ...

  5. Nodejs的运行原理-生态篇

    前言 这里是重点:Nodejs 是由v8 engine,libuv和内置模块组成,可以将v8 engine和 libuv看成一个库,两者是以源码的方式直接编译执行node中去的. 这是一个广泛的介绍, ...

  6. Nodejs的运行原理-模块篇

    前言 使用Nodejs,就不可避免地引用第三方模块,它们有些是Nodejs自带的(例:http,net...),有些是发布在npm上的(例:mssql,elasticsearch...) 本篇章聚焦3 ...

  7. Nodejs的运行原理-函数回调篇

    前言 当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程:开始于libuv,终止于js代码里的callback(promise ...

  8. 谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

  9. nginx如何调用PHP(nginx+php运行原理)

    采用nginx+php作为webserver的架构模式,在现如今运用相当广泛.然而第一步需要实现的是如何让nginx正确的调用php.由于nginx调用php并不是如同调用一个静态文件那么直接简单,是 ...

随机推荐

  1. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  2. Nginx软件部署配置过程

    ---恢复内容开始--- 注意:博主使用的系统为: [root@web01 ~]# uname -a Linux web01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar ...

  3. backbone与require的共存问题解决

    如果向下面那样直接列出script标签可能会出现错误,   <script type="text/javascript" src="/dep/jquery-1.11 ...

  4. Libcurl的编译_HTTP/HTTPSclient源代码演示样例

    HTTP/HTTPSclient源代码演示样例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2 ...

  5. MySQL数据库使某个不是主键的字段唯一

    在使用MySQL数据的过程中有时候我们须要某个不是主键的字段不反复.这个时候就要用到SQL的UNIQUE约束了. 以下摘抄自w3school里的一段介绍: UNIQUE 约束唯一标识数据库表中的每条记 ...

  6. 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作

    无监控,不运维.好了,废话不多说,下面都是干货. 警告:流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html ...

  7. Redis的那些最常见面试问题

    随笔:经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估 ...

  8. WebGL学习(3) - 3D模型

      原文地址:WebGL学习(3) - 3D模型   相信很多人是以创建逼真酷炫的三维效果为目标而学习webGL的吧,首先我就是

  9. Cenos 6.5上的subverion的yum配置笔记

    Subversion在CenOS 6.5上的安装配置 1.安装 yum install subversion 2.配置   #创建目录   mkdir /opt/svn   #创建版本库   svna ...

  10. CET——4 常用短语

    在网上看到的,先拔到自己这来,四级大大,求过!!!!