【问题标题】:Why is the "Hello world" printed 2 times?为什么“Hello world”会打印 2 次?
【发布时间】:2020-02-03 12:31:54
【问题描述】:

为什么程序打印“Hello World”两次而不是一次? console.log 在 cluster.fork() 之前执行。

import * as cluster from "cluster";

console.log("Hello World");

if (cluster.isMaster) {
    const worker = cluster.fork();
    worker.disconnect();
}

以下 c 程序仅打印 1 次“Hello World”

#include <unistd.h>
#include <stdio.h>
int main(void)
{
   printf("HelloWorld/n");
   fork();
   return 0;
}

【问题讨论】:

    标签: javascript node.js multiprocessing fork node-cluster


    【解决方案1】:

    cluster.fork 方法(通过 child_process.fork,它是 calls)不会像在 UNIX 中那样执行 fork 系统调用。它确实创建了一个新的子进程,就像 fork 一样,但是这个新的子进程从一个全新的解释器实例开始,并且这个新的解释器从头开始执行脚本。您会看到 console.log 在父进程中执行一次,在子进程中执行一次。

    child_process.fork 的文档简要提到了这一点...

    与 fork(2) POSIX 系统调用不同,child_process.fork() 不会克隆当前进程。

    ...但我仍然会说这个名字令人困惑。

    要解决此问题,您可能需要将初始化逻辑(在本例中为 console.log 调用)移动到 if (cluster.isMaster) 块中。

    【讨论】:

      【解决方案2】:

      cluster.fork 创建一个新的子进程并执行相同的代码。您应该检查进程是否是主进程,然后在 if 块或 else 块中执行您想要的代码。

      import * as cluster from "cluster";
      
      
      if (cluster.isMaster) {
          console.log("Hello World from master");
          const worker = cluster.fork();
          worker.disconnect();
      } else {
          console.log("Hello World from others");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 2012-10-06
        • 2013-08-23
        • 1970-01-01
        • 2019-03-19
        • 2018-10-31
        • 1970-01-01
        相关资源
        最近更新 更多