惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
Vercel News
Vercel News
Last Week in AI
Last Week in AI
H
Help Net Security
The Cloudflare Blog
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
I
InfoQ
U
Unit 42
美团技术团队
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
量子位
博客园_首页

博客园 - Adam.Zhao

简单示例理解神闭包 ejs 模板使用方法 我使用的开源组件汇总,以备学习使用 了不起的Node.js--之五 TCP连接 Windows7下Java运行时环境搭建 了不起的Node.js--之三 了不起的Node.js--之二 了不起的Node.js--之一 请大家有需要购物的到我的网站上吧。 AngularJS应用骨架 最近在研究google的angularjs 好久没有来写博客了 c#二进制文件数据转换base64字符串文本代码 ActionFilterAttribute做切面编程的Url的格式化例子 学习content-type 网站性能优化之服务端(一) 艺龙旅行网招聘了 关于项目管理的几点建议 HP CQ35 Windows7声卡驱动安装不上问题
了不起的Node.js--之四
Adam.Zhao · 2014-04-17 · via 博客园 - Adam.Zhao

阻塞与非阻塞IO

绝大多数对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使用事件轮询,触发一个和文件描述符相关的通知。