node.JS 采用单线程异步非阻塞模式.
node.JS 的性能不是最高的, 因为 JavaScript 引擎的关系, node.JS 默认是单线程, 一个 node.JS 应用无法利用多核资源. 不过有第三方库提供多线程支持, 但不是无缝的. node.JS 是解决 I/O 瓶颈的 (相对于传统技术, 同步阻塞调用浪费线程), 它并没有提高 I/O 速度, 只是资源调度更高效. 如果 I/O 速度不解决, node.JS 只能说能同时处理好多 request, 但每个 request 的响应时间还是那么长, 甚至更长.
Node.JS 实现异步, 非阻塞:
Node.JS 其实只有 JS 执行是单线程, I/O 显然是其它线程.
JS 执行线程是单线程, 把需要做的 I/O 交给 libuv, 自己马上返回做别的事情, 然后 libuv 在指定的时刻回调就行了. 其实简化的流程就是酱紫的! 细化一点, Node.JS 会先从 JS 代码通过 node-bindings 调用到 C/C++ 代码, 然后通过 C/C++ 代码封装一个叫 "请求对象" 的东西交给 libuv, 这个请求对象里面无非就是需要执行的功能 + 回调之类的东西, 给 libuv 执行以及执行完实现回调.
总结来说, 一个异步 I/O 的大致流程如下:
1, 发起 I/O 调用
用户通过 JavaScript 代码调用 Node 核心模块, 将参数和回调函数传入到核心模块;
Node 核心模块会将传入的参数和回调函数封装成一个请求对象;
将这个请求对象推入到 I/O 线程池等待执行;
JavaScript 发起的异步调用结束, JavaScript 线程继续执行后续操作.
2, 执行回调
I/O 操作完成后, 会取出之前封装在请求对象中的回调函数, 执行这个回调函数, 以完成 JavaScript 回调的目的.(这里回调的细节下面讲解)
从这里, 我们可以看到, 我们其实对 Node.JS 的单线程一直有个误会. 事实上, 它的单线程指的是自身 JavaScript 运行环境的单线程, Node.JS 并没有给 JavaScript 执行时创建新线程的能力, 最终的实际操作, 还是通过 Libuv 以及它的事件循环来执行的. 这也就是为什么 JavaScript 一个单线程的语言, 能在 Node.JS 里面实现异步操作的原因, 两者并不冲突.
来源: http://www.css88.com/qa/node-js/10817.html