做为异步事件驱动的JavaScript运行时,Node旨在构建可伸缩的网络应用程序,在下面的“hello world”示例中,能够同时处理许多链接,在每次链接时都会触发回调,可是若是没有工做要作,Node将会休眠。git
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
这与目前使用OS线程的更常见的并发模型造成对比,基于线程的网络效率相对较低且很是难以使用,此外,Node的用户没必要担忧死锁,由于没有锁。Node中几乎没有任何函数直接执行I/O,所以进程永远不会阻塞,因为没有任何阻塞,可扩展系统在Node中开发很是合理。github
若是不熟悉这种语言,有一篇关于阻塞与非阻塞的完整文章。segmentfault
Node在设计上与Ruby的Event Machine或Python的Twisted等系统相似,并受其影响,Node进一步采用事件模型。它将事件循环呈现为运行时构造而不是库,在其余系统中,始终存在阻塞调用以启动事件循环。一般,行为是经过脚本开头的回调来定义的,最后经过阻塞调用来启动服务器,如EventMachine::run()
。Node在执行输入脚本后简单地进入事件循环,当没有更多回调要执行时,Node退出事件循环,此行为相似于浏览器JavaScript — 事件循环对用户隐藏。浏览器
HTTP是Node中的一等公民,设计时考虑了流媒体和低延迟,这使得Node很是适合Web库或框架的基础。服务器
仅仅由于Node没有线程设计,并不意味着你没法利用环境中的多个核心优点,子进程能够经过使用咱们的child_process.fork()
API生成,而且设计为易于与之通讯,基于相同的接口构建的是群集模块,它容许你在进程之间共享sockets,以便在核心上实现负载平衡。网络