【发布时间】:2017-10-18 13:44:24
【问题描述】:
我想要在大型阵列上执行复杂的 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());
});
但是当我这样做时,节点会给出错误:
生成 E2BIG
我遇到了this article
因此,将数据管道传输到子进程似乎是要走的路。我的代码现在是:
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 左右时才有效,否则会超时。
【问题讨论】:
-
node 不是此类工作的正确工具。我宁愿推荐你使用多线程语言。
-
项目已完成 90%,我现在不会从节点更改。有很多文章解释了 node 的高 CPU 使用率
-
通常最好先着手解决核心问题的项目。在多线程语言中,您不需要复制数据,因为线程共享内存。在这种情况下复制数据会减慢一切。除此之外,当您将工作委托给 libuv 时,节点速度很快。如果您打算使用节点的 v8 部分进行繁重的处理,那么它不会很快。另外,如果出于任何原因这是实际服务器的一部分,您的事件循环将阻塞并且 I/O 将导致您的所有请求超时。
-
我很感激,但有一些方法可以解决这个问题,例如neilk.net/blog/2013/04/30/…
-
你为什么不把它分块发送@Mark?
标签: javascript node.js mongodb