[英]How can i thread image processing in NodeJS?
我正在NodeJS上編寫圖像處理Web服務,並且從根本上講,我需要弄清楚如何使實際的圖像處理成為線程。 當我通過Apache AB NodeJS進行測試時,NodeJS僅使用了一個內核並且停滯了,我肯定在這里做錯了。 我如何重新設計這個簡單的應用程序,以利用服務器CPU上的多個內核。
我縮小了所有輸入過濾的范圍並簡化了圖像處理功能,以使您了解應用程序的結構,而不是冗長的代碼位。
在app.js中
app.get('/generate/:q', function(req, res){
var textString = req.params.q;
res.setHeader("Content-Type", "image/png");
res.end(generator.s());
});
在generate.js中
var Canvas = require('canvas')
, Font = Canvas.Font
, fs = require('fs')
, path = require("path")
, plate = new Canvas.Image;
//To keep plate in RAM between requests.
fs.readFile(__dirname + '/plates/dhw132.png', function(err, squid){
if (err) throw err;
plate.src = squid;
});
exports.s = function () {
canvas = new Canvas(731,1024);
ctx = canvas.getContext('2d');
ctx.drawImage(plate, 0, 0, plate.width, plate.height);
return canvas.toBuffer();
}
我如何重寫此代碼以使generator.s()成為線程?
Node當然是單線程的,但是多線程的需求是一個非常有效的用例。 我知道兩種方法。
為什么不使用群集。 您將獲得可配置數量的進程/線程,默認情況下,計算機上的cpus數量。 群集實質上是跨進程對應用程序進行負載平衡,並透明地處理單個監聽http端口的那些進程共享。
http://nodejs.org/api/cluster.html
這里也有一個包裝器: https : //github.com/dpweb/cluster-node
一個不同的選項,您可以直接進行此過程,這是一個示例,其中使用lame將上載的文件轉換為mp3。對於您的情況,您將所有圖像處理封裝在一個單獨的應用程序中,因此clusters選項可能更干凈那樣做。
app.post('/process', function(req, res){
var f = req.files.filen;
fs.rename(f.path, f.name, function(err) {
if (err){
fs.unlink(f.name, ef);
throw err;
return;
}
fs.unlink(f.path, function() {
var ext = "." + req.body.extn;
require('child_process').exec("lame "+f.name, function(err, out, er) {
var nfn = f.name + '.mp3';
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-disposition', 'attachment; filename='+nfn);
res.setHeader("Content-Transfer-Encoding: binary");
res.setHeader('Accept-Ranges: bytes');
var size = fs.statSync(nfn).size;
console.log(size, f.name, nfn)
res.setHeader('Content-Length', size);
fs.createReadStream(nfn).pipe(res);
fs.unlink(nfn, ef); fs.unlink(f.name, ef);
})
})
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.