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的运行原理了!
Nodejs的运行原理-调用篇的更多相关文章
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- Nodejs的运行原理-架构篇
前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理. PS:此系列只做Nodejs的运行 ...
- Nodejs的运行原理-libuv篇
前言 这应该是Nodejs的运行原理的第7篇分享,这篇过后,短时间内不会再分享Nodejs的运行原理,会停更一段时间,PS:不是不更,而是会开挖新的坑,最近有在研究RPG Maker MV,区块链,云 ...
- Nodejs的运行原理-科普篇
前言 Nodejs目前处境稍显尴尬,很多语言都已经拥有异步非阻塞的能力.阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接收生成好的数据,然后或渲染后,或直接发送到 ...
- Nodejs的运行原理-生态篇
前言 这里是重点:Nodejs 是由v8 engine,libuv和内置模块组成,可以将v8 engine和 libuv看成一个库,两者是以源码的方式直接编译执行node中去的. 这是一个广泛的介绍, ...
- Nodejs的运行原理-模块篇
前言 使用Nodejs,就不可避免地引用第三方模块,它们有些是Nodejs自带的(例:http,net...),有些是发布在npm上的(例:mssql,elasticsearch...) 本篇章聚焦3 ...
- Nodejs的运行原理-函数回调篇
前言 当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程:开始于libuv,终止于js代码里的callback(promise ...
- 谈谈 Python 程序的运行原理
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...
- nginx如何调用PHP(nginx+php运行原理)
采用nginx+php作为webserver的架构模式,在现如今运用相当广泛.然而第一步需要实现的是如何让nginx正确的调用php.由于nginx调用php并不是如同调用一个静态文件那么直接简单,是 ...
随机推荐
- jQuery使用serialize(),serializeArray()方法取得表单数据+字符串和对象类型两种表单提交的方法
原始form表单值获取方式(手动): $.ajax({ type: "POST", url: "ajax.php", data: "Name=摘取天上 ...
- Woody的Python学习笔记1
Python 是一种解释性语言:这意味着开发过程中省去了编译这个环节,类似于PHP\Perl. Python 是交互式语言:这意味着你能够在一个python提示符,直接互动运行写你的程序. Pytho ...
- Ubuntu Linux訪问小米手机存储卡
操作系统: 麒麟14.04 安装工具 sudo apt-get install mtpfs libfuse-dev libmad0-dev sudo mkdir /media/mtp 重新启动与使用 ...
- 为什么MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云游戏行业资深架构师 余国良 MOBA类和"吃鸡"游戏为什么对网络延迟要求高? 我们知道,不同类型的游戏因为玩法. ...
- 【JAVA零基础入门系列】Day7 Java输入与输出
[JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...
- 四.RabbitMQ之发布/订阅(Publish/Subscribe)
一.基础知识点 在上述章节中,我们理解的RabbitMQ是基于如下这种模式运作的. 而事实上,这只是我们简单化了的模型的结果,真正的模型应该是这样的. P:Producer 生产者,生产消息,把它放进 ...
- 青否云 - 小程序待办事项vue开源系统
青否云最新开源系统:小程序待办事项 vue-demo 青否云 vue demo 下载地址:https://github.com/qingful/vue-demo 官网 http://cloud.qin ...
- idea配置svn
建议使用第二种方式比较简本人是使用第二种方式比较简单, 解决更新svn项目到本地报错的问题. ntelliJ IDEA 管理项目是十分的方便的,但有的小伙伴初次使用时,可能会遇到使用svn更新项目至本 ...
- SpringBoot里mybatis查询结果为null的列不返回问题的解决方案
对于mybatis里查询结果为null的列不返回的问题解决方案 在配置文件application.properties里增加 Mybatis.configuration.call-setters-on ...
- Android项目实战(三十五):多渠道打包
多渠道打包: 可以理解为:同时发布多个渠道的apk.分别上架不同的应用商店.这些apk带有各自渠道的标签,用于统计分析各个商店的下载次数等数据. 实现步骤 一.添加友盟渠道标签 添加位置:app目录下 ...