为什么程序要打印两次“ 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;
}
答案 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");
}