gpt4 book ai didi

node.js - 如何在 node.js Web 服务器中执行重复的长时间运行的后台任务

转载 作者:行者123 更新时间:2023-12-01 23:08:22 27 4
gpt4 key购买 nike

我正在使用 express.js 开发一个 node.js 网络服务器,它应该提供一个仪表板来监控数据库服务器。

架构非常简单:

  • 收集器在预定义的时间间隔内检索信息并存储数据
  • express.js 监听用户请求并根据存储的数据显示仪表板

我现在想知道如何最好地实现 gatherer 以确保它不会阻塞主循环,最简单的解决方案似乎是只使用基于 setTimeout 的方法,但我想知道什么这将是构建“正确的方式”?

最佳答案

您关心的是您的信息收集步骤。它可能并不像看起来那样占用大量 CPU。因为它是一个监控应用程序,它可能通过联系其他机器来收集信息,就像这样。

async function  gather () {
const results = []
let result
result = await getOracleMetrics ('server1')
results.push(result)
result = await getMySQLMetrics ('server2')
results.push(result)
result = await getMySQLMetrics ('server3')
results.push(result)
await storeMetrics(results)
}

这不是 CPU 密集型函数。 (如果您对图像进行快速傅立叶变换, 将是一个 CPU 密集型函数。)

它花费大部分时间等待结果,然后花一点时间存储它们。使用 async/await 会给你一种同步运行的错觉。但是,每个 await 都会产生其他事物的主循环。

您可以像这样每分钟调用它。 .then().catch() 异步调用它。

setInterval (
function go () {
gather()
.then()
.catch(console.error)
}, 1000 * 60 * 60)

如果您确实需要执行一些 CPU 密集型计算,您有几个选择。

  1. 将其卸载到 worker thread .

  2. 将其分解成小块,中间有休眠。

    sleep = function sleep (howLong) {
    return new Promise(function (resolve) {
    setTimeout(() => {resolve()}, howLong)
    })
    }

    async function gather () {
    for (let chunkNo = 0; chunkNo < 100; chunkNo++) {
    doComputationChunk(chunkNo)
    await sleep(1)
    }
    }

sleep() 函数通过等待超时到期而让步到主循环。

抱歉,这些都没有调试过。

关于node.js - 如何在 node.js Web 服务器中执行重复的长时间运行的后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70377015/

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