如何在node.js中运行后台任务?这样我就可以同时并行地执行多个请求,而不会阻塞UI。一旦请求完成,我就可以通知用户操作已完成,结果已就绪。在处理一个请求的同时,最终用户还可以自由地执行其他操作
发布于 2020-03-31 20:48:35
Javascript是单线程的,所以您的程序必须是异步的。Javascript使用事件(回调、超时)来编排许多快速函数调用的运行。Nodejs没有要阻塞的UI,但是这些快速函数可以被慢速函数阻塞。Javascript的这种异步特性适用于nodejs和浏览器代码。
我相信你的问题是关于如何处理花费大量时间的操作。
一种方法是将这些操作拆分成许多块--快速函数调用--并让每个操作使用setTimeout()
启动下一个操作。在不了解长时间运行的函数的情况下,很难建议如何做到这一点。这里有一个关于这个主题的问题和一些答案。How to break up a long running function in javascript, but keep performance
总结你使用这种代码得到的答案。
function (data, callbackWhenDone) {
let n = 0
const max = data.length;
const batchSize = 100;
try {
function doBatch () {
let i
for (var i = 0; i < batch && n < max; ++i, ++n) {
doComputation(data[n])
}
if (n < max) setTimeout(doBatch, 0)
else callbackWhenDone(null, data)
}
} catch (error) {
callbackWhenDone(error)
}
doBatch()
}
批处理末尾的setTimeout(fn,0)
通过在Javascript的主循环中排队超时来启动下一批处理。该队列中的其他项目将有机会运行。每个批处理都知道从哪里开始,因为doBatch()
函数会在n
运行时更新它。当整个批处理完成时,它会调用您传入的回调函数。回调使用典型的nodejs模式,其中第一个参数(如果不为空)是错误。
另一种方法是使用Worker Threads。您可以将计算的Javascript代码放入单独的Javascript上下文中并运行它。您将需要在主nodejs进程和线程之间来回传递数据的技巧。在尝试此操作之前,请确保您有一个可靠的调试器设置;它可能会让人感到困惑。
https://stackoverflow.com/questions/60950354
复制相似问题