我怎样才能在NodeJS中线程化image processing?

我在NodeJS上编写image processingWeb服务,在基本上我需要弄清楚如何使实际的image processing线程化。 当我通过Apache AB进行testing时,NodeJS只使用了一个内核,并且在这里做错了。 我如何重新devise这个简单的应用程序,以利用我的服务器CPU上的多个核心。

我放大了所有的input过滤,并简化了image processingfunction,让您了解应用程序结构,而不是长码位。

在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当然是单线程的,但是对于multithreading的需求是非常有效的用例。 有两种方式我知道。

你为什么不使用群集。 你会得到一个可configuration数量的进程/线程,默认情况下你的机器上的cpus数量。 集群本质上是在跨进程负载平衡你的应用程序,并透明地处理共享单个监听http端口的进程。

http://nodejs.org/api/cluster.html

这里还有一个包装器: https : //github.com/dpweb/cluster-node

一个不同的选项,你可以直接分叉进程,这里是一个例子,上传的文件被转换为MP3使用lame ..为了你的情况,你会封装所有的image processing在一个单独的应用程序,所以群集选项可能会更清洁这样做。

 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); }) }) }) })