首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在node.js中运行后台任务

在node.js中运行后台任务
EN

Stack Overflow用户
提问于 2020-03-31 20:16:57
回答 1查看 5.4K关注 0票数 1

如何在node.js中运行后台任务?这样我就可以同时并行地执行多个请求,而不会阻塞UI。一旦请求完成,我就可以通知用户操作已完成,结果已就绪。在处理一个请求的同时,最终用户还可以自由地执行其他操作

EN

回答 1

Stack Overflow用户

发布于 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

总结你使用这种代码得到的答案。

代码语言:javascript
运行
复制
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进程和线程之间来回传递数据的技巧。在尝试此操作之前,请确保您有一个可靠的调试器设置;它可能会让人感到困惑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60950354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档