Javascript NodeJs/expressjs:在回调中运行冗长的代码

Javascript NodeJs/expressjs:在回调中运行冗长的代码,javascript,multithreading,node.js,Javascript,Multithreading,Node.js,回调是异步的,所以这是否意味着如果我在回调中运行长时间的计算,它不会影响我的主线程 例如: function compute(req,res){ // this is called in an expressjs route. db.collection.find({'key':aString}).toArray(function(err, items) { for(var i=0;i<items.length;i++){ // items leng

回调是异步的,所以这是否意味着如果我在回调中运行长时间的计算,它不会影响我的主线程

例如:

function compute(req,res){    // this is called in an expressjs route.
    db.collection.find({'key':aString}).toArray(function(err, items) {
        for(var i=0;i<items.length;i++){      // items length may be in thousands.
            // Heavy/lengthy computation here, Which may take 5 seconds.
        }
        res.send("Done");
    });
}
函数compute(req,res){//这是在expressjs路由中调用的。
find({'key':aString}).toArray(函数(err,items){

对于(var i=0;i大多数情况下,node.js在单个线程中运行。但是,node.js允许您进行执行低级操作(文件读取、网络请求等)的调用它们由单独的线程处理。因此,您的数据库调用很可能发生在单独的线程上。但是,当数据库调用返回时,我们将返回主线程,您的代码将在主线程中运行(阻止它)

解决此问题的方法是启动一个新线程。您可以使用
cluster
执行此操作。请参阅:

  • 您的主程序将进行数据库调用
  • 当数据库调用完成时,它将调用
    fork()
    并启动一个新线程,该线程运行
    your calculations.js
    ,并向其发送一个包含任何输入数据的事件
  • your calculations.js
    将侦听事件,并在处理事件时进行必要的处理
  • your calculations.js
    将在主线程完成处理后将事件发送回主线程(它可以将任何输出数据发送回主线程)
  • 如果主线程需要输出数据,它可以侦听
    your calculations.js
    发出的事件

如果您不能执行或不想使用线程,您可以使用setImmediates将长时间的计算拆分。例如(在我的平板电脑上快速写入,因此可能会很草率)


在每100次计算之间,node将有时间处理其他请求、处理其他回调,等等。当然,如果它们触发另一次巨大的计算,最终事情将停止。

回调在主线程中-node.js只有一个线程。任何时候,如果在node.js中花费超过两毫秒的时间而没有d把它放到另一个进程中,你应该会感觉很糟糕。:)是的,我感觉很糟糕,但对此不能做任何事情吗?事实上我说了5秒钟。但是,有时需要一些处理。看起来像是一个解决方案,我必须先阅读。谢谢。当然,我会检查进程。setImmediate。谢谢。
function compute(startIndex, max, array, partialResult, callback) {
   var done = false;
   var err = null;
   var stop = startIndex+100;  // or some reasonable amount of calcs...
   if (stop >= max) {
      stop = max;
      done = true;
   }

   // do calc from startIndex to stop, using partialResult as input
   if (done)
      callback(err, result);
   else 
      process.setImmediate ( go look this part up or I'll edit tomorrow)...
       But the idea is you call youself again with start += 100.
}