为啥“Hello world”会打印 2 次?

Posted

技术标签:

【中文标题】为啥“Hello world”会打印 2 次?【英文标题】: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;

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于为啥“Hello world”会打印 2 次?的主要内容,如果未能解决你的问题,请参考以下文章

为什么在Python 2.7中自动打印括号?

n power n print 'Hello World' 不计算值

Prolog:制作打印 Hello World 的程序

oracle学习之第一个存储过程:打印Hello World

java 线程示例,每秒打印一次Hello world

如何通过按下连接到 piface 数字 2 上的终端的按钮来打印“Python 中的 Hello world”