Node.JS 采用非阻塞异步 IO 的方式来处理请求. 基于 Libuv 的事件循环机制, node 得以通过单线程来处理高并发的请求.
Node.JS 处理高并发的原理:
1, 每个 Node.JS 进程只有一个主线程在执行程序代码, 形成一个执行栈 (execution context stack).
2, 主线程之外, 还维护了一个 "事件队列"(Event queue). 当用户的网络请求或者其它的异步操作到来时, node 都会把它放到 Event Queue 之中, 此时并不会立即执行它, 代码也不会被阻塞, 继续往下走, 直到主线程代码执行完毕.
3, 主线程代码执行完毕完成后, 然后通过 Event Loop, 也就是事件循环机制, 开始到 Event Queue 的开头取出第一个事件, 从线程池中分配一个线程去执行这个事件, 接下来继续取出第二个事件, 再从线程池中分配一个线程去执行, 然后第三个, 第四个.
主线程不断的检查事件队列中是否有未执行的事件, 直到事件队列中所有事件都执行完了, 此后每当有新的事件加入到事件队列中, 都会通知主线程按顺序取出交 EventLoop 处理. 当有事件执行完毕后, 会通知主线程, 主线程执行回调, 线程归还给线程池.
4, 主线程不断重复上面的第三步.
总结:
我们所看到的 node.JS 单线程只是一个 JS 主线程, 本质上的异步操作还是由线程池完成的, node 将所有的阻塞操作都交给了内部的线程池去实现, 本身只负责不断的往返调度, 并没有进行真正的 I/O 操作, 从而实现异步非阻塞 I/O, 这便是 node 单线程和事件驱动的精髓之处了.
来源: http://www.css88.com/qa/node-js/12250.html