2015-06-19 2 views
0

Здесь у меня есть Node.Js, где я хочу сделать обработку изображений в подпроцессе.Pass Buffer to 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); 

Однако, когда я запускаю этот файл я получаю эту ошибку:

[Error: Поток дает пустой буфер]

Для меня кажется, что буфер не передан правильно подпроцессу? Что я не так? Что можно сделать для запуска обработки изображений в подзадаче. Для меня важно, чтобы его не читали из файла в подпроцессе. Поскольку я хочу снова прочитать один файл, а затем отправить буфер на несколько подпроцессов, которые преобразуют изображения. Благодаря!

+1

'gm' уже делает это в подпроцессе. (Асинхронно) – befzz

+0

Привет @befzz, это здорово, не могли бы вы предоставить мне ссылку, где говорится об этом? И написать это как ответ? Благодаря! –

+0

Но его не асинхронно? –

ответ

3

Вы не выполняете какую-либо работу в подпроцессе. Это всего лишь 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 в последней строке, чтобы завершить работу.

Взгляните на модуль cluster для альтернативного подхода.