原文地址:https://nodejs.org/en/about/
作为一个异步事件驱动javaScript执行环境,Node被设计来构建可扩展的网络应用。在下面这个“hello world”示例中,可以同时处理许多并发连接。根据每个连接请求,Node将会调用对应的回调函数。如果没有工作需要完成时,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}/`);});这种编程模型和如今使用广泛的基于操作系统线程的并发编程模型行程了强烈的对比。基于线程的网络处理工作非常的低效并且难于使用。此外,Node开发人员得以从考虑各种进程死锁中解放出来,因为Node中根本就没有锁。在Node中几乎没有方法会直接操作I/O,因此进程从来不会被阻塞。因为没有阻塞,用Node开发可扩展的系统非常容易。 如果你觉得以上内容对你而言非常陌生,这里有一篇文章专门介绍“Blocking vs Non-Blocking”(阻塞式编程和非阻塞式编程:https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/)。
Node受到了Ruby的“Event Machine”和Python的“Twisted”非常多的影响,并且Node本身也和这两种架构非常类似。在此基础之上,Node对事件模型做了进一步的优化。Node在运行时通过事件循环(event loop)来进行主要操作。在其他系统中当事件处理机制触发时总是伴随着阻塞调用。在Node中我们会在脚本开头通过回调定义系统的常规行为,并且在脚本末尾通过一个阻塞调用形如:EventMachine::run()
来启动一个服务器。Node会在执行完输入脚本后直接进入事件循环机制。当系统中没有其他回调需要执行时,Node就会保持事件循环。这一特性正如浏览器中的Javascript执行环境—开发人员永远也看不到事件循环机制的存在。 HTTP是Node中的第一类型,并被设计为流式(streaming)和低延迟。这个特性使得Node非常适用于作为网络事务和系统框架来开发。 虽然Node在设计之初就尽可能规避线程这个概念,但这并不意味着你不能从多核环境中获得优势。子进程可以通过调用非常简单的child_PRocess.fork()
API而被大量生产出来。另一个基于相同接口的cluster
模型,能提供你在进程间分享sockets连接来使你系统的多核能够负载均衡。
新闻热点
疑难解答