为什么 "Hello world" 打印了 2 次?

Why is the "Hello world" printed 2 times?

为什么程序打印 "Hello World" 2 次而不是只打印 1 次? console.log 在 cluster.fork() 之前执行。

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

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

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

Unlike the fork(2) POSIX system call, child_process.fork() does not clone the current process.

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

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

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