node.js中的节点究竟是什么?

use*_*476 10 javascript erlang node.js

在Erlang中,我能够立即理解"节点"的概念 - 一个独立的Erlang VM.我可以在一台机器上启动一个节点erl -name gandalf -setcookie abc,在另一台机器上(在同一局域网上)另一个节点启动erl -name bilbo -setcookie abc.然后,我可以在gandalf上生成进程,这些进程可以与bilbo上的其他进程神奇地进行通信.现在,因为我还想提供一个带有Erlang进程动画图形结果的爵士网页,所以我选择了一些Javascript并学习了jQuery.仍然是一个不起眼的paduwan,但我有点理解Javascript如何适应事物的方案.

我最近遇到了node.js,一个(邪恶的)声音开始窃窃私语:'就是这样!现在你可以使用Javascript做任何事情!忘记Erlang和守卫和时期,坚持每个人都使用的语言'.

我已经阅读了一些文档,但我仍然不明白node.js中的节点是什么.我是否必须运行http服务器并成为我的节点?如果我不喜欢http怎么办,或者我不在乎gandalf如何与bilbo交谈 - 这就是我在Erlang中所喜欢的.也许我不知道:vely期望node.js是带有Javascript糖的erlang吗?

小智 7

Node.js与Twisted比Erlang/OTP 有更多共同之处.Node.js只是一个单线程SEDA事件循环.在涉及分发,热代码重新加载和通过进程的可伸缩性时,Node.js与Erlang VM没有任何关系,它与"使用Javascript糖的Erlang"无关


Pap*_*ipo 7

也许是因为你的Erlang知识,你认为Node.js与"节点"(作为erlang节点)有某种关系,但它只是名称.

Node.js的主要思想是推迟所有昂贵的I/O操作并将回调分配给这些操作的结果.原因是I/O阻止了此时正在运行的(唯一)进程.鉴于您正在以正确的方式编码,Node.js将为您处理此问题.

一个简单的例子是数据库调用:

result = SQL.query("EXPENSIVE SELECT HERE")
doSomething(result);
moreStuff(); // This line must wait until the previous ones are completed.
Run Code Online (Sandbox Code Playgroud)

在节点中,您将以一种非常不同的方式对其进行编码:

SQL.query("EXPENSIVE SELECT HERE", function(result) {
  doSomething(result);
});
moreStuff(); // This line executes inmediately
Run Code Online (Sandbox Code Playgroud)

如果您的Node.js脚本中有错误的代码,例如:

while(true) { }
Run Code Online (Sandbox Code Playgroud)

然后您阻止该进程,它将无法处理比当前请求更多的请求,因此在Node.js中必须遵循上述准则.


Ada*_*and 4

据我了解,Node.JS 节点是 V8 引擎的一个实例,其中运行 Node.JS 运行时和事件循环。虽然 Node.JS 运行时使您能够非常快速、简单地开始处理 HTTP 请求,但这不是强制性的;它确实非常擅长处理大多数类型的异步 I/O。

我对Erlang了解不多,但我粗浅的了解是它的强大之处在于高并发计算。Node.JS 本身并不专注于此。它的核心是“事件化I/O”,干净利落地处理异步I/O。