node.js的单线程异步是什么意思呢?(转)
Posted wilsunson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js的单线程异步是什么意思呢?(转)相关的知识,希望对你有一定的参考价值。
首先必须明白,开发者所编写的javascript代码都是运行在JavaScript脚本引擎上的。Node.js采用的是V8引擎,这个引擎最初是被用在一些浏览器上,比如Chrome。
浏览器的主要结构就包括渲染引擎(也称浏览器内核,比如常听说的webkit、blink)和JavaScript脚本引擎。JavaScript引擎的一个重要作用就是为了操作DOM,如果采用多线程的结构的话很容易导致冲突,比如多段代码在操作同一个的DOM元素的时候会因为执行时间先后导致执行结果难以预测。所以采用了单线程的形式简化问题,同时还让渲染引擎和JavaScript引擎互斥的方式执行,也就是相互阻塞,渲染的页面的时候不执行脚本,执行脚本的时候不渲染页面。
但是JavaScript的功能不光是操作DOM啊,尤其是AJAX技术出现之后,JavaScript还有发送网络请求的作用,继续用单线程的方式会阻塞整个页面。但是又要支持这种异步的操作,怎么办呢?
JavaScript引擎于是采用回调的形式来处理异步问题。当进行可能产生阻塞的IO操作时(比如网络请求、文件读写),那么交给底层的线程来处理,同时JavaScript引擎内部维护一个执行队列,轮询底层线程的执行结果,当某个执行完成时,调用对应的回调函数返回结果。
再回到Node.js,JavaScript引擎作为Node.js的一部分,也将这种特性带入了Node.js。但是与浏览器环境不同的是,Node.js没有了渲染引擎,同时内部还有一些其他的C++库来处理IO操作。所以常说的单线程异步特性指的是JavaScript引擎的特性。下面是Node.js的运行简图
Node.js和Java在线程最大的区别应该是。Node.js的子线程是底层控制的,对于开发者而言是不可见的(Node.js 10 以后的版本添加了实验性功能,支持多线程处理CPU密集型问题。),好处就是开发者不再需要关注线程的管理,只需要写好异步代码就行,而Java提供了多线程的API,需要开发者手动管理。
打个比方,就像C++对内存操作开放给了开发者,但是Java的内存由jvm管理。
以上是关于node.js的单线程异步是什么意思呢?(转)的主要内容,如果未能解决你的问题,请参考以下文章