在后台执行计算密集型任务

时间:2015-12-27 17:18:03

标签: node.js

我有一项任务,在执行时需要大量计算而没有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) {
});

2 个答案:

答案 0 :(得分:3)

从阻止node.js中的主线程中删除计算密集型内容的常用方法是将该工作传递给另一个进程。有很多方法可以构建它。

  1. 群集,其中有一组进程,所有进程都设计为执行相同的操作,每个进程都会收到不同的传入请求。
  2. 创建一个专门用于执行给定任务的特定子进程,并创建运行的子进程,然后在需要完成此特定任务时在任务期间完成。
  3. 创建一组子进程和一个工作队列,让每个子进程从队列中获取工作项,执行它,回传结果,然后从队列中获取下一项等等......
  4. 并且,这些技术可以组合在一起,也可以组合使用。

    在第一种情况下,你只是创造了更多的进程,他们都在做同样的事情。

    在另外两种情况下,您专门将计算密集型工作移至子进程,因此主要进程不会受到该工作的负担或阻止。

    有许多库可以帮助提供使用子进程的接口。一个这样的库提供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();
});