为什么“ Hello world”被打印两次?

时间:2019-10-05 13:28:36

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

为什么程序要打印两次“ Hello World”而不是仅打印1次?在cluster.fork()之前先删除console.log。

import * as cluster from "cluster";

console.log("Hello World");

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

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

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

2 个答案:

答案 0 :(得分:4)

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)块中。

答案 1 :(得分:0)

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");
}