我有一个需要在大型数组上进行的复杂CPU密集型工作。理想情况下,我希望将其传递给子进程处理。
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
里的回调没有被执行。我该如何在我的子进程获得一个流?
编辑
我不得不放弃缓冲区方法。现在我将数组作为消息发送:
var cp = require('child_process');
var child = cp.fork('/getStatistics.js');
child.send({
dataAsNumbers: dataAsNumbers
});
但是只有在 dataAsNumbers 的长度低于约 20,000 时才有效,否则会超时。