jzlxiaohei

乱七八糟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。不过已经有一些讨论和项目了,大家可以看一下

一篇访谈

一个开源项目

分类:

技术点:

相关文章: