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

我有一个任务,需要大量的计算没有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) { }); 

通常情况下,通过阻止node.js中的主线程来移除计算密集的东西的方法是将这个工作传递给另一个进程。 有很多方法来构build它。

  1. 集群中你有一组进程都devise执行相同的事情,每一个获得一个不同的传入请求。
  2. 创build专门devise的特定subprocess来执行给定的任务,并创build运行的subprocess,然后在任务完成时完成该任务。
  3. 创build一组subprocess和一个工作队列,让每个subprocess从队列中获取工作项,执行它,传回结果,然后从队列中获取下一个项,等等。

而且,这些技术也可以组合在一起。

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

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

有许多库可以帮助提供使用subprocess的接口。 一个这样的库提供了webWorkertypes的接口 。

您需要后台工作人员以及您的Web实例和工作者实例之间的某种通信协议。 比如你可以用kue来创build任务队列

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