gpt4 book ai didi

javascript - NodeJs/expressjs : Run lengthy code in a callback

转载 作者:行者123 更新时间:2023-12-02 17:01:54 50 4
gpt4 key购买 nike

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

例如:

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");
});
}

因此,对数据库的调用是异步的。这是否意味着回调内的 for 循环不会阻塞主线程?

如果它是阻塞的,我如何以异步方式执行这些事情?

最佳答案

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

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

http://nodejs.org/api/cluster.html

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

关于javascript - NodeJs/expressjs : Run lengthy code in a callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25615961/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com