为啥 nodejs 中的睡眠不能按预期工作

Posted

技术标签:

【中文标题】为啥 nodejs 中的睡眠不能按预期工作【英文标题】: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? 【参考方案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));

【讨论】:

以上是关于为啥 nodejs 中的睡眠不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

电脑在睡眠状态下能远程吗?能否在远程进行登入唤醒。。

NodeJS 承诺睡眠时间太长

异步/等待清晰度,带有睡眠示例

睡眠功能不按顺序工作

当 sleep() 不能很好地与警报一起工作时,我还能做啥“睡眠”?

为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能