Я пытаюсь понять, как работает 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 и другие дочерние методы позволяют отправлять только аргументы для командной строки, но не переменную? Может быть, есть какие-то способы сделать это? Извините за сумбурный текст и спасибо.
ищите "межпроцессное взаимодействие"...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Сначала попробовал
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)
Нет, два отдельных процесса не могут получить доступ к памяти друг друга.