乱七八糟Nodejs系列二:线程模型
2013-09-05 23:23 jzl 阅读(548) 评论(0) 编辑 收藏 举报上一篇中说了这样一句话:Nodejs和浏览器javascript一样,都是单线程,所以和传统的不一样,这个后面有机会再说。挖了坑就得填,哎。
1.一个例子
来看一个例子,这个例子来自async javascript
1: function f()
2: {
3: var start = new Date();
4: setTimeout(function(){
5: var during = new Date() -start;
6: console.log(during);
7: },0)
8:
9: while(new Date() - start<1000 ){}
10: }
11: f();
问第6行中,during 会是多少?
答案是 不少于1000
这就和javascript的线程模型有关(不考虑html5的 Web Workers)
简单地说,javascript是单线程,所以执行f()的时候,setTimeout只是在事件队列中(以下简称queue)注册一个事件。f将一直运行,直到结束,然后解释器会在事件队列中找一个满足执行条件的函数(假设叫f2)执行,然后一直等到f2运行完,再到queue中去找可以运行的函数。
所以,上面的 f 函数执行完了,解释器才会去看有没有可以执行函数,虽然触发时间是0,但是执行时,时间已经至少过去1000 ms了。
还是建议大家去看看《async JavaScript》,特别是第一章。而且,这书已经有中文版了。
最后来一道面试题吧
function f() { setTimeout(function(){ console.log("fuck"); },0) while(true ){} } f();
问,控制台什么时候输出fuck。
这个就不难作答了:fuck这词是和谐词汇,控制台会屏蔽的~~
2.Nodejs
Nodejs是单线程异步执行模型,这是JavaScript这门语言的特点是一致的。
Node不适合做计算密集的程序,适合做IO密集的程序,而web服务器大多是IO密集型的。
异步方式,会一定程度打乱写程序的思路。不过已经有不少开源的库可以让我们写比较舒服的异步程序,也就是比较舒服。。
不过单线程也就意味着Node本身没有同步问题,这直接kill一个大问题。
另外对于Nodejs 在多核架构的应用,我不是很懂,因为我也是刚学习Nodejs。不过已经有一些讨论和项目了,大家可以看一下