Почему «Привет, мир» напечатан 2 раза? - PullRequest
1 голос
/ 05 октября 2019

Зачем дозировать программу "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;
}

Ответы [ 2 ]

4 голосов
/ 05 октября 2019

Метод cluster.fork (через child_process.fork, который он вызывает ) не выполняет системный вызов fork, как в UNIX. Он создает новый дочерний процесс, как вилка, но этот новый дочерний процесс начинается с совершенно нового экземпляра интерпретатора, и этот новый интерпретатор начинает выполнять сценарий с самого начала. Вы видите console.log, выполненный один раз в родительском процессе и один раз в дочернем процессе.

В документах по child_process.fork кратко упоминается это ...

В отличие отfork (2) системный вызов POSIX, child_process.fork () не клонирует текущий процесс.

... но я бы все равно сказал, что имя сбивает с толку.

Для работывокруг этого вы, вероятно, захотите переместить логику инициализации (в этом примере вызов console.log) в блок if (cluster.isMaster).

0 голосов
/ 05 октября 2019

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