2015-06-19 64 views
0

在这里,我已经在Node.Js上进行子进程中的图像处理。将缓冲区传递给ChildProcess Node.js

正如你将看到我拿那个文件image.jpg并希望将其写回hello.jpg在子进程:

var node = require('child_process').spawn('node',['-i']); 
var fs = require('fs'); 

node.stdout.on('data',function(data) { 
    var fs = require('fs'); 
    var gm = require('gm').subClass({ imageMagick: true }); 

    gm(data) 
    .resize(500, 500) 
    .toBuffer("jpg", function(err, buffer) { 
     if (err) { 
     console.log(err); 
     }else{ 
     fs.writeFile("hello.jpg", buffer); 
     } 
    }); 
}); 


var buffer = fs.readFileSync(__dirname + "/image.jpg"); 
node.stdin.write(buffer); 

然而,当我运行这个文件,我得到这个错误:

[错误:流产生空缓冲区]

对我来说,好像缓冲区没有正确传递到子进程? 我错了什么? 如何在子任务中运行图像处理?对我来说,重要的是它不从子进程中的文件中读取。因为我想再次读取一个文件,然后将缓冲区发送到进行图像转换的几个子进程。谢谢!

+1

'gm'已经在子进程中做了(异步) – befzz

+0

嗨@befzz,这很好,请你给我提供一个链接,它说这个吗?并把它写成答案?谢谢! –

+0

但它不是异步的权利? –

回答

3

你没有在子过程中做任何工作。这只是node -i而没有别的。所有图像处理都在主要过程中进行。

要解决它,你可以实际运行的另一个节点的过程,并给它一些脚本来执行,说worker.js

process.stdin.on('data',function(data) { 
    var fs = require('fs'); 
    var gm = require('gm').subClass({ imageMagick: true }); 

    gm(data) 
    .resize(500, 500) 
    .toBuffer("jpg", function(err, buffer) { 
     if (err) { 
    console.log(err); 
     }else{ 
    fs.writeFile("hello.jpg", buffer); 
     } 
    }); 
}); 

那么你会从你的主脚本创建子进程:

var node = require('child_process').spawn('node', ['worker.js']); 
var fs = require('fs'); 

var buffer = fs.readFileSync(__dirname + "/image.jpg"); 
node.stdin.end(buffer); 

请注意,我在最后一行使用了node.stdin.end来终止worker。

看看cluster模块的替代方法。

相关问题