Node.js
作为异步事件驱动的JavaScript运行时,Node旨在构建可伸缩的网络应用程序。在下面的“hello world”示例中,可以同时处理许多连接。在每次连接时都会触发回调,但是如果没有工作要做,Node将会休眠。
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中开发非常合理。
Node在设计上与Ruby的Event Machine或Python的Twisted等系统类似,并受其影响。Node进一步采用事件模型。它将事件循环呈现为运行时构造而不是库。在其他系统中,始终存在阻塞调用以启动事件循环。通常,行为是通过脚本开头的回调来定义的,最后通过阻塞调用来启动服务器EventMachine::run()
。在Node中没有这样的start-the-event-loop调用。节点在执行输入脚本后简单地进入事件循环。当没有更多回调要执行时,节点退出事件循环。此行为类似于浏览器JavaScript - 事件循环对用户隐藏。
HTTP是Node中的一流公民,设计时考虑了流媒体和低延迟。这使得Node非常适合Web库或框架的基础。
仅仅因为Node没有线程设计,并不意味着您无法利用环境中的多个核心。子进程可以通过使用我们的child_process.fork()
API生成,并且易于与之通信。该cluster
模块基于相同的接口构建,允许您在进程之间共享套接字,以便在核心上实现负载平衡。