Nodejs

作为异步事件驱动的JavaScript运行时,Node.js旨在构建可扩展的网络应用程序。在下面的“ hello world”示例中,可以同时处理许多连接。在每个连接上都会触发回调,但是如果没有工作要做,Node.js将进入睡眠状态。

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.js的用户无需担心死锁该进程,因为没有锁。Node.js中几乎没有功能直接执行I / O,因此该过程永远不会阻塞。由于没有障碍,因此在Node.js中开发可伸缩系统非常合理。

如果某些语言不熟悉,则有完整的文章介绍 Blocking vs. Non-Blocking


Node.js在设计上与Ruby的Event Machine和Python的Twisted之类的系统相似,并受其影响 Node.js使事件模型更进一步。它将事件循环作为运行时构造而不是库呈现在其他系统中,始终存在阻止调用以启动事件循环。通常,行为是通过脚本开头的回调定义的,最后是通过诸如的阻塞调用来启动服务器 EventMachine::run()在Node.js中,没有这样的start-the-event-loop调用。Node.js在执行输入脚本后仅进入事件循环。没有更多的回调要执行时,Node.js退出事件循环。此行为类似于浏览器JavaScript-事件循环对用户隐藏。

HTTP是Node.js中的一等公民,在设计时考虑了流和低延迟。这使Node.js非常适合于Web库或框架的基础。

没有线程而设计的Node.js并不意味着您无法利用环境中的多个内核。子进程可以使用我们的child_process.fork()API 产生,并且设计为易于通信。cluster模块是基于同一接口构建的,该模块使您可以在进程之间共享套接字,以实现内核上的负载平衡。