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.
}