在单线程的情况下,NodeJs是如何分发子任务去执行的?

对于大多数非NodeJs的应用程序来说,在同时处理多任务的时候,通常是开启多个子线程去处理子任务;但是对于NodeJs来说,因为他本身是单线程的,那么他还能支配什么子单位去做那些子任务? 其实可以这样问,NodeJs支配去做子任务的“子单位”究竟是什么?
关注者
71
被浏览
7,536

9 个回答

JavaScript确实是单线程,它所有的事件都基于轮询的方式来达到异步处理。

但是,诸如node这样单线程异步为主的平台实际上都是需要驱动支持的。如果你用一个同步的数据库驱动来做你node.js服务的支撑,那可就完全无法达到node标榜的高并发了。这也是为什么Node的作者没有选用lua做为node这个平台的实现语言,因为lua的同步库太多,人们往往不自觉、不自知的就去用同步的lib了,显然有违他的初衷。

而如果我们把Node这个整个平台作为一套解决方案来看,那么它的前端(语言)虽然是单线程的,但后端则可能是多路复用的非阻塞I/O或者线程池模拟的异步I/O。在这个方案中,语言前端可以基于EL的轮询来查看句柄的状态,而同时后端则可以利用epoll/kqueue/IOCP等技术来进行高性能的异步I/O并且做为后端支撑。

当然除此以外还是有些别的高并发模型的,比如Actor什么的.


@液漏酱
//相对来说,这个可能比较接近你想表达的意思,但实际上这段代码不能说是准确的验证,勉强算模拟吧。

var 
	fs=require('fs'),
	EventEmitter=require('events').EventEmitter,
	event=new EventEmitter(),
	i=1

fs.open('Asyi.js', 'r', function(err, fd){
	setTimeout(function(){
		console.log("lu");
	},100) //读的太快,delay一下
});

event.on('test',function(){
	console.log('Current Number:'+(i++))
})

setInterval(function(){ //用0来模拟连续的串行事件。
	event.emit('test')
},0)

单线程只有单任务,后续任务只是被放进队列排队。

同步和异步,用Loupe直观地理解Javascript运行时