Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在后台执行计算密集型任务_Node.js - Fatal编程技术网

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

Node.js 在后台执行计算密集型任务,node.js,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

我有一个任务在执行时需要大量的计算,而没有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中阻塞主线程中删除计算密集型内容的常用方法是将该工作传递给另一个进程。有很多方法可以构建这种结构

  • 在集群中,您有一组进程,所有进程都被设计为执行相同的事情,并且每个进程都会收到不同的传入请求
  • 创建专门为执行给定任务而设计的特定子进程,并创建在任务期间运行并在需要完成此特定任务时完成的子进程
  • 创建一组子进程和一个工作队列,让每个子进程从队列中获取一个工作项,执行它,反馈结果,然后从队列中获取下一个项,等等
  • 而且,这些技术可以结合使用,也可以一种结合使用

    在第一种情况下,您只是创建了更多的进程,所有进程都在做相同的事情

    在另外两种情况下,您具体地将计算密集型工作转移到子进程,这样主进程就不会因该工作而负担过重或受阻


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

    您需要后台工作程序以及web实例和工作程序实例之间的某种通信协议。例如,您可以使用创建任务队列

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

    启动一个子流程。您是否有机会与更详细地描述这些事情是如何完成的任何方法有任何外部链接?我很好奇这些是怎么做的!通过子进程,我认为异步调用另一个计算逻辑的express/etc服务器。我不确定我是否走远了@jfriend00@MarkPieszak-node.js的核心子进程库位于以下位置:。我已经为您提供了一个指向webWorker接口库的链接(在我的回答中)。实际上,有数百个模块是为解决类似的问题而编写的。使用哪一种取决于您尚未分享的具体情况。非常感谢!我还有很多书要读。我不是OP,只是好奇,在过去的一年里,我一直在更积极地学习。谢谢朋友!