将缓冲区传递到子进程Node.js



我在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);

但是,当我运行此文件时,出现此错误:

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

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

您没有在子流程中执行任何工作。它只是node -i,仅此而已。您的所有图像处理都发生在主进程中。

要修复它,您实际上可以运行另一个 Node 进程并给它一些脚本来执行,例如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来终止工作线程。

查看群集模块以了解替代方法。

最新更新