为什么“ Hello world”被打印两次?
为什么程序要打印两次“ 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;
}
回答如下:cluster.fork
方法(通过child_process.fork
,通过child_process.fork
)没有像在UNIX中那样进行calls系统调用。它像fork一样创建一个新的子进程,但是该新子进程从一个全新的解释器实例开始,并且该新解释器从头开始执行脚本。您会看到fork
在父进程中执行一次,在子进程中执行一次。console.log
的文档简要提到了这一点...
与fork(2)POSIX系统调用不同,child_process.fork()不会克隆当前进程。...但是我还是会说这个名字很混乱。
要解决此问题,您可能希望将初始化逻辑(在此示例中为child_process.fork
调用)移到console.log
块中。
为什么“ Hello world”被打印两次?
为什么程序要打印两次“ 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;
}
回答如下:cluster.fork
方法(通过child_process.fork
,通过child_process.fork
)没有像在UNIX中那样进行calls系统调用。它像fork一样创建一个新的子进程,但是该新子进程从一个全新的解释器实例开始,并且该新解释器从头开始执行脚本。您会看到fork
在父进程中执行一次,在子进程中执行一次。console.log
的文档简要提到了这一点...
与fork(2)POSIX系统调用不同,child_process.fork()不会克隆当前进程。...但是我还是会说这个名字很混乱。
要解决此问题,您可能希望将初始化逻辑(在此示例中为child_process.fork
调用)移到console.log
块中。