Узел js. Как передать переменную дочернему процессу?

Я пытаюсь понять, как работает child_process, и не вижу никаких вариантов передачи переменной дочернему процессу. Моя ситуация:

Main.js

[const arr = [10,20,30,40,50]


for (let g of arr ){
      
    function(g) // I want to launch every loop in a separate process because there are a lot of async functions inside and it takes a lot of time to process.
    
  }

Сначала я попробовал child_process.fork :

//Main.js

const { fork } = require('child_process');

const forked = fork('test/child.js');


for (let g of arr){
      
    forked.send(g);
    
  }

//Child.js

process.on('message', (msg) => {
    console.info('Message from parent:', function(msg));
  });

Child.js получил переменную g, но процесс выполнения функции стал намного длиннее простого цикла.

Во-вторых, я попробовал child_process.execFile

//I made a simple loop from 0 to 5 to see the speed without sending variables

for (let i = 0;i< arr.length;i++){ 
      
    
const { execFile } = require('child_process');
  

const child = execFile('node', ['test/child.js'], 
        (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.info(stdout);
});
}

Здесь я получил отличный результат. 5 быстрых и параллельных исполнений. Но как я вижу нет возможности отправить это целое число из массива в child.js и другие дочерние методы позволяют отправлять только аргументы для командной строки, но не переменную? Может быть, есть какие-то способы сделать это? Извините за сумбурный текст и спасибо.

Нет, два отдельных процесса не могут получить доступ к памяти друг друга.

jabaa 14.11.2022 10:33

ищите "межпроцессное взаимодействие"...

derpirscher 14.11.2022 12:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала попробовал child_process.fork

Проблема с вашей попыткой заключалась в том, что вы разветвляли только один дочерний процесс, а не 5 из них. Затем вы отправили 5 сообщений тому же процессу. Вы захотите

// Main.js
const { fork } = require('child_process');
for (let g of arr) {
    const forked = fork('test/child.js'); // inside the loop!
    forked.send(g);
}
// Child.js
process.on('message', (msg) => {
    console.info('Message from parent:', function(msg));
});

Я решил свою проблему. Возможно, это примитивное решение, но оно работает.

Main.js

const { execFile } = require('child_process');
require('dotenv').config()
async function Main(){
  
  arr = [0,1,2,3,4,5,6,7,8,9,10]

  for (i = 0;i<arr.length;i++){

  process.env.msg = arr[i]
  
  await new Promise(resolve => setTimeout(resolve, 50));
    Child()
    
  }

}

 function Child(){
  const child = execFile('node', ['test/child.js'], 
    (error, stdout, stderr) => {
if (error) {
throw error;
}
console.info(stdout);
    });
 }
Main()

Ребенок.js

const { execFile } = require('child_process');

console.info(process.env.msg)

Другие вопросы по теме