上一篇中说了这样一句话: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。不过已经有一些讨论和项目了,大家可以看一下

一篇访谈

一个开源项目

乱七八糟Nodejs系列二:线程模型的更多相关文章

  1. 死磕 java线程系列之线程模型

    问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...

  2. WPF QuickStart系列之线程模型(Thread Model)

    这篇博客将介绍WPF中的线程模型. 首先我们先来看一个例子,用来计算一定范围内的素数个数. XAML: <Grid> <Grid.RowDefinitions> <Row ...

  3. 乱七八糟 Nodejs 系列一:试水

    看Nodejs比较舒服的人,个人认为主要是: 以前是后端,转成前端的人: 前端巨牛的人: 后端巨牛的人: 巨牛的人... 当然还有我这种,脑抽不止的人~~ 不过学习的过程中发现,如果不是上来就用exp ...

  4. NodeJs系列二:你好,世界

    安装nodejs 什么是nodejs中的模块 hello,world

  5. java并发系列(二)-----线程之间的协作(wait、notify、join、CountDownLatch、CyclicBarrier)

    在java中,线程之间的切换是由操作系统说了算的,操作系统会给每个线程分配一个时间片,在时间片到期之后,线程让出cpu资源,由其他线程一起抢夺,那么如果开发想自己去在一定程度上(因为没办法100%控制 ...

  6. posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

    posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...

  7. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...

  8. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  9. c# 多线程系列二 自定义线程执行器

    看了第一篇文章,多线程系列,看到了在线程执行任务队列有了一定的了解~! 那么今天我来讲讲,怎么样构建通用的自定义线程概念! 线程执行任务,肯定要有目标,但是如果写死了,那么一个线程处理执行职能按照思路 ...

随机推荐

  1. VS2013编译libcurl

    首先从这里下载libcurl的package: http://curl.haxx.se/libcurl/ 然后解压,里面有个winbuild文件夹,这里是为windows构建工程的文件夹.里面有nma ...

  2. 找到 OSChina 早上 8 点钟容易宕机的原因 ?

    最近一段时间,OSChina 网站在早上 8 点出头的时候很容易因为数据库连接池爆满而导致网站宕机.表现的情况是数据库处理大量的查询,堆积大量并发连接,导致无法再连接到数据库,执行一个简单的查询速度也 ...

  3. zabbix 插件使用问题

    [elk@dr-mysql01 frontend]$ ../../bin/logstash -f std02.conf Settings: Default pipeline workers: 8 Pi ...

  4. 【转】Linux 中断学习之小试牛刀篇

    原文网址:http://www.linuxidc.com/Linux/2011-02/32129.htm 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入 ...

  5. 【转】JAVA 读写二进制文件

    原文网址:http://shiminghua234.blog.163.com/blog/static/263912422011619102350866 import java.io.*; /** * ...

  6. 多个ajax按照顺序执行的方法

    $.ajax({ dataType: "json", async: false, //只需将此属性设置为false url: ~~, type: "GET", ...

  7. 理解i-node

    原文链接:http://www.ruanyifeng.com/blog/2011/12/inode.html 感觉讲得挺好,便做个记录.

  8. java中 SSL认证和keystore使用

    java中 SSL认证和keystore使用 2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报   目录(?)[+]     好久没用过SSL认证了,东西久不用,就有点生疏. ...

  9. MVC VIEW 时间格式控制

    @Convert.ToDateTime(Model.CheckPatronExclusionResults.RequestTime).ToString("yyyy-MM-dd HH:mm:s ...

  10. 腾讯2013笔试题—web前端笔试题 (老题练手)

    问题描述(web前端开发附加题1): 编写一个javascript的函数把url解析为与页面的javascript.location对象相似的实体对象,如:url :'http://www.qq.co ...