【问题标题】:What exactly is a node in node.js?node.js 中的节点到底是什么?
【发布时间】:2010-07-27 19:23:13
【问题描述】:

在 Erlang 中,我能够立即理解“节点”的概念——一个独立的 Erlang 虚拟机。我可以用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 的方式。也许我 nai:vely 期望 node.js 是带有 Javascript 糖的 erlang?

【问题讨论】:

  • “我最近遇到了 node.js,一个(邪恶的)声音开始窃窃私语”——可能是 Douglas Crockford。
  • 也许,但前提是邪恶的声音也说永远不要使用 ++ 或 --。
  • 或者总是用四个空格缩进,不是 2 不是 3,而且绝对不是 \t...
  • 可能是因为 Ryan Dahl 之前与 Erlang 合作过?

标签: javascript erlang node.js


【解决方案1】:

Node.js 与 Twisted 的共同点比 Erlang/OTP 多得多。 Node.js 只是一个单线程 SEDA 事件循环。在分发、热代码重载和进程可扩展性方面,Node.js 无法与 Erlang VM 相比,它与“带有 Javascript 糖的 Erlang”一点也不接近

【讨论】:

    【解决方案2】:

    也许因为您对 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.
    

    在节点中,你会以一种非常不同的方式来编码:

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

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

    while(true) { }
    

    那么你就阻塞了进程,它将无法处理比当前请求更多的请求,因此在 Node.js 中必须遵循上述准则。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        node.js 中没有“节点”

        如前所述,当你运行时

        node my_script.js 
        

        您正在运行一个 V8 java 脚本解释器实例 (在其生命周期内使用一个核心)。

        【讨论】:

          猜你喜欢
          • 2019-02-15
          • 1970-01-01
          • 2013-11-18
          • 2020-02-12
          • 2017-07-25
          • 2013-05-29
          • 2012-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多