У меня сложная работа с интенсивным процессором, которую я хочу делать на большом массиве. В идеале я хотел бы передать это дочернему процессу.
var spawn = require('child_process').spawn;
// dataAsNumbers is a large 2D array
var child = spawn(process.execPath, ['/child_process_scripts/getStatistics', dataAsNumbers]);
child.stdout.on('data', function(data){
console.log('from child: ', data.toString());
});
Но когда я это делаю, node дает ошибку:
spawn E2BIG
Я столкнулся с этой статьей
Таким образом, передача данных в дочерний процесс, по-видимому, является способом выхода. Теперь мой код:
var spawn = require('child_process').spawn;
console.log('creating child........................');
var options = { stdio: [null, null, null, 'pipe'] };
var args = [ '/getStatistics' ];
var child = spawn(process.execPath, args, options);
var pipe = child.stdio[3];
pipe.write(Buffer('awesome'));
child.stdout.on('data', function(data){
console.log('from child: ', data.toString());
});
И затем в getStatistics.js:
console.log('im inside child');
process.stdin.on('data', function(data) {
console.log('data is ', data);
process.exit(0);
});
Однако обратный вызов в process.stdin.on
не достигнут. Как я могу получить поток в моем дочернем script?
ИЗМЕНИТЬ
Мне пришлось отказаться от буферного подхода. Теперь я отправляю массив как сообщение:
var cp = require('child_process');
var child = cp.fork('/getStatistics.js');
child.send({
dataAsNumbers: dataAsNumbers
});
Но это работает только тогда, когда длина dataAsNumber составляет менее 20 000, в противном случае время истекает.