Node.js是什么以及为什么要用它?
Node.js 是什么
简单地说,Node.js 是使得 JavaScript 能在服务端运行的平台,使得 JavaScript 能像其它的后台语言一样可以操作网络、系统等。
Node.js 是怎么诞生的
Ryan Dahl 认为 I/O 处理地不好,会因为同步执行而阻塞整个进程。
传统的 Web 服务技术是对每一个请求启动一个线程处理。但是大部分时间都花在了等待 I/O 操作完成上,所以需要大量的资源来管理这些线程。因此,服务器的“一个请求一个线程”的方法并不好。
Dahl 认为软件应该能够处理多任务,并建议减少等待 I/O 返回的时间。他认为,处理多个并发连接的正确方法是使用单线程、事件循环和非阻塞 I/O ,而不是使用线程模型。例如,查询数据库的时候,应该给它指定一个回调函数,以便执行后面其他的操作,当结果返回时,执行回调函数。
Node.js 是怎么工作的
Node.js 中有一个重要的机制叫做事件循环,能够让单线程的 JavaScript 执行非阻塞的 I/O 操作。事件循环从代码中获取任务并执行。如果任务是异步的或者是一个 I/O 操作,则事件循环将它交给系统内核执行(例如建立新的连接)或线程池(如与文件系统相关的操作)。然后事件循环将会获取下一个任务去执行。
由于大多数现代的内核是支持多线程的,所以可以在后台同时执行多个操作。当其中的某一个操作完成的时候(这是一个事件),内核将通知 Node.js ,Node.js 会把回调函数添加到轮询队列中,然后被执行。
为适应单线程事件循环,Node.js 使用 libuv 库,而 libuv 又使用固定大小的线程池来并行处理一些非阻塞异步 I/O 操作。主线程调用函数将任务发送到共享任务队列,然后线程池中的线程将执行这些任务。
为什么要用 Node.js
因为 Node.js 中没有直接操作 I/O 的函数,所以进程不会阻塞(I/O 操作交给了系统内核异步执行)。
什么时候用 Node.js
得益于事件循环,单线程和非阻塞 I/O,Node.js 在高强度的 I/O 应用程序中表现最好,这些应用有很多高并发连接,比如视频和音频流、实时应用程序、实时聊天、游戏应用程序、协作工具或股票交易所软件。
Node.js 不适合 CPU 密集型应用,CPU 密集型应用使用传统的线程模型来实现会更佳。