了不得的Node.js--之四

阻塞与非阻塞IOnode

绝大多数对node.js的讨论都把关注点放在了其处理高并发的能力上。Node框架给开发者提供了构建高性能网络应用的强大能力。网络

我使用的开发工具是Mac版的WebStorm,这个工具支持Nodejs,只要按照以下步骤设置便可以支持并发

阻塞框架

尝试区分下面PHP代码和Node代码有什么不一样:异步

PHP代码示例:函数

//PHP
print('Hello');
sleep(5);
print('World');

Node代码示例:高并发

//node
console.log('Hello');
setTimeout(function(){
console.log('World');
},5000);

上述代码Node.js使用了回调函数,二者的区别集中在阻塞和非阻塞的区别上。工具

PHP sleep()阻塞了线程的执行,程序进入sleep时,就什么事情都不作了。性能

而Node.js使用了事件轮询,所以这里setTimeout是非阻塞的。开发工具

若是在setTimeout后再加入console.log语句的话,该语句会被马上执行:

console.log('Hello');
setTimeout(function(){
console.log('World');
});
console.log('Bye');

//这段脚本会输出:
//Hello
//Bye
//World

采用了事件轮询意味着什么呢?从本质上说,Node会先注册事件,随后不停地询问内核这些事件是否已经分发。当事件分发时,对应的回调函数就会被触发,而后继续执行下去。

若是没有事件触发,则继续执行其它代码,直到有新事件时,再去执行对应的回调函数。

和阻塞相反,setTimeout仅仅只是注册了一个事件,而程序继续执行,因此,这是异步的。

Node并发实现也采用了事件轮询。与timeout所采用的技术同样,全部像http、net这样的原生模块中IO部分也都采用了事件轮询技术。和timeout机制中Node内部会不停地等待,

并当超时完成时,触发一个消息通知同样,Node使用事件轮询,触发一个和文件描述符相关的通知。

相关文章
相关标签/搜索