簡體   English   中英

我如何在NodeJS中線程圖像處理?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM