New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
1.0 nodejs基础知识总结 #6
Comments
node特点参考:关于node.js的误会 1、 js单线程,node多线程我们所说的node.js单线程,是指node.js并没有给我们创建一个线程的能力,所有我们自己写的代码都是单线程执行的,在同一时间内,只能执行我们写的一句代码。其实是js是单线程。但宿主环境node.js是多线程的,它会维护一个执行队列,循环检测,调度JavaScript线程来执行。因此单线程执行和并发操作并不冲突。 node.js利用Google的V8 Javascript 引擎来解析JavaScript语句,但系统真正调用执行的代码是用C++写的,我们做的只是用JavaScript语句来调用这些底层API,所以不用担心其执行效率过低问题. 2、 异步I/O让单线程远离阻塞,使其适合于密集I/O的场景
毫不夸张的说node.js最大的特定就是采用异步I/O和事件驱动架构,对于高并发解决方案传统架构师多线程模型,为每个业务逻辑童工一个线程,通过系统线程切换来来弥补同步I/O调用的时间开销。node.js使用的是单线程模型,对所有I/O都采用异步式的请求方式,避免频繁的上下文切换,在node.js执行的时候维护着一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步I/O请求完成后都会被推送到事件队列中的等待执行。 对于一个简单的数据库访问操作,传统方式是这样实现的 res = db.query('SELECT * from some_table');
res.output(); 代码执行到第一行的时候线程会阻塞,等待query返回结果,然后继续处理。由于数据库查询、磁盘读写、网络通信等原因阻塞时间会非常大(相对于CPU始终频率)。对于高并发的访问,一方面线程长期阻塞等待,另一方面为了应付新情求而不断添加新线程,会浪费大量系统资源,同时线程的增加也会也会占用大量的CPU时间来处理内存上下文切换。看看node.js怎么处理 db.query('SELECT * from some_table', function(res) {
res.output();
}); 2.1 CPU密集型任务进程 vs. 线程 2.2 IO密集型任务,比如Web应用参考:进程 vs. 线程 3、事件驱动
大多数网站的服务器端都不会做太多的计算,它们只是接收请求,交给其它服务(比如文件系统或数据库),然后等着结果返回再发给客户端。所以聪明的Node.js针对这一事实采用了第二种策略,它不会为每个接入请求繁衍出一个线程,而是用一个主线程处理所有请求。避开了创建、销毁线程以及在线程间切换所需的开销和复杂性。这个主线程是一个非常快速的event loop,它接收请求,把需要长时间处理的操作交出去,然后继续接收新的请求,服务其他用户。下图描绘了Node.js程序的请求处理流程: 主线程event loop收到客户端的请求后,将请求对象、响应对象以及回调函数交给与请求对应的函数处理。这个函数可以将需要长期运行的I/O或本地API调用交给内部线程池处理,在线程池中的线程处理完后,通过回调函数将结果返回给主线程,然后由主线程将响应发送给客户端。那么event loop是如何实现这一流程的呢?这要归功于Node.js平台的V8引擎和libuv。 |
Node.js的模块载入方式与机制 在Node中引入模块采用缓存不论是核心模块还是文件模块,require()方法对相同的模块的二次加载都一律采用缓存优先的方式 没有缓存,需要经历如下3个步骤1、 路径分析
2、 文件定位
3、 编译执行每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache对象上,以提高二次引用的性能。 (function(exports, require, module, __filename, __dirname){
var math = require("math");
exports.area = function(radius){
return Math.PI * radius * radius
}
}) |
浅析 NodeJs 的几种文件路径
The text was updated successfully, but these errors were encountered: