为啥 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 中的睡眠不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章