http://cnodejs.org/topic/51659db96d38277306d202a3
node.js的单线程就是主线程,主线程是什么?就是事件队列,node.js(javascript)就是面向事件驱动的编程,web是事件化的,os也是事件化的。os的服务(I/O,database)都是在自己独立的进程中完成,当发生一个请求后,node.js只是在这个事件队列中注册一个事件,然后就不管了,具体这个事件的执行就交给了os(i/o,database)不同的进程,等os完成后,通过回调(node.js会轮询)再回到主线程的处理,所以node.js单线程是指自己的主线程,而不是所有的操作都是在这个线程里,这个线程只是事件调度,事件的执行都是交给操作系统在其它的线程中完成。所以node.js是非I/O阻塞,而不是非cpu阻塞,那么node.js会出现cpu阻塞,是不是性能就会有问题呢?不是的,就象Nginx一样,因为对web而言运算是非常非常小的,一次I/O的操作的时间远大于你做百万次的for循环。
相对的并发是如果一个服务器可以开250个线程,再加上线程池就可以保证一定的并发量。
但是,线程是什么?是OS执行的最小单元,由线程ID,当前指令指针(PC),寄存器集合和堆栈组成(是不是专业的都要背?),然而线程是昂贵的,线程对cpu和内存的占用都是很重的,就象一个人跑步一样,你加速了,停下,启动再加速,那是很费力的。这就使得HTTP SERVER的后起之秀nginx以光的速度蔓延开来,nginx就是以单线程为基础的,为什么nginx快?
nginx进程模型是所有需要阻塞请求的部分全部由epool(事件通知接口)触发相应事件,非阻塞(处理耗时 很短)部分用主线程一直执行,直到遇到阻塞部分就停止,交由阻塞部分监听异步完成事件,这样就构成了事件驱动模型。这部分可以研究一下nginx进程就可以得知。
http://chembo.iteye.com/blog/1367283
虽然nodejs是单线程的,但它的IO操作是多线程的
4. 事件驱动
传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。
相反的,NodeJS使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
http://www.tangwen.org/archives/163
http://freewind.me/blog/20120516/926.html
二、Nodejs是单线程吗?
我们写下的js代码,是在单线程的环境中执行,但nodejs本身不是单线程的。如果我们在代码中调用了nodejs提供的异步api(如IO等),它们可能是通过底层的c(c++?)模块在另外的线程中完成。但对于我们自己的js代码来说,它们处于单线程中。因为异步函数执行完将结果通过回调函数传给我们的时候,我们的代码一次只能处理一个。

浙公网安备 33010602011771号