我有一项任务,在执行时需要大量计算而没有IO,我不想在执行此任务时阻止线程。我怎样才能在Node.js
?
我需要这样的东西:
var taskManager = require("some-background-task-lib")
var doSomething = function() {
// this code will calculate something and block thread
}
// this line should not block the Node.js event loop, but execute in background, then call the provided function when done
taskManager.executeInBackground(doSomething, function(err, returnValues) {
});
答案 0 :(得分:3)
从阻止node.js中的主线程中删除计算密集型内容的常用方法是将该工作传递给另一个进程。有很多方法可以构建它。
并且,这些技术可以组合在一起,也可以组合使用。
在第一种情况下,你只是创造了更多的进程,他们都在做同样的事情。
在另外两种情况下,您专门将计算密集型工作移至子进程,因此主要进程不会受到该工作的负担或阻止。
有许多库可以帮助提供使用子进程的接口。一个这样的库提供webWorker type of interface。
答案 1 :(得分:0)
您的Web实例和工作器实例之间需要后台工作者和某种通信协议。例如,您可以使用kue创建任务队列
// web worker
var kue = require('kue');
var queue = kue.createQueue();
....
app.post('/calculateSomeCrazyStuff', (req, res, err) => {
queue.create('myLongRunningJobName1', {
fibonacciSequence: 52
}).save((err) => {
if (err) {
return next(err);
}
res.status(204).send();
});
});
// jobs worker
var kue = require('kue');
var queue = kue.createQueue();
queue.process('myLongRunningJobName1', function(job, done) {
// calculate fibonacci
done();
});