【问题标题】:why sleep in nodejs doesn't work as expected为什么 nodejs 中的睡眠不能按预期工作
【发布时间】:2016-12-14 08:21:11
【问题描述】:

我用这个library 在循环中休眠,我的循环看起来像这样

while(condition){
    usleep(1)
    while(condition){
        usleep(1)
        // ... do stuff (sync)
    }
}

虽然我只睡了 1us,但循环永远不会终止它只是需要很长时间,但是当我删除 sleep 语句时,它只是运行并完成。

我正在尝试休眠以使 CPU 平静下来,而不是 100% 使用,以便服务器继续接受其他请求!

在循环中使用 setTimeout 不是一个好主意,因为 setTimeout 是异步的。

我想使用递归,但我担心它会太慢,我正在迭代 100000 左右

【问题讨论】:

  • 请告诉我这不是生产代码,我建议您尝试弄清楚为什么您的 CPU 一直在 100% 燃烧。您到底想做什么?
  • 您能在控制台中查看sleep: using busy loop fallback 消息吗?如果存在,则模块回退到 while... 循环阻塞
  • 为什么不使用 setTimeout?

标签: javascript node.js sleep


【解决方案1】:

Sleep 会阻塞当前线程,因此这实际上不会帮助您尝试接受其他请求。您可以尝试使用sleep-async 之类的方法来完成这项工作。

【讨论】:

  • 这仍然无法解决他使用过多 CPU 的问题。
  • 很有趣,这看起来不像是答案,但确实如此。您不能休眠以允许节点中的其他请求,因为节点在其默认配置中是单线程的,这是 OP 试图做的。做得很好。
【解决方案2】:

如果你真的需要保持现在的代码,请使用 Promises 和 async/await。这样您的应用程序就不会因其他请求而被阻止。

你可以这样开始:

async function sleep(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms);
    });
}

async function run() {
    while(condition){
        await sleep(1000);
        // ... do stuff
    }
}

run().catch(err => console.error(err));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2012-08-27
    • 2021-05-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多