【问题标题】:why CPU-bound tasks freeze the event loop in node.js?为什么 CPU 密集型任务会冻结 node.js 中的事件循环?
【发布时间】:2026-01-14 20:30:02
【问题描述】:

wikipedia:

长期计算和其他 CPU 密集型任务冻结整个事件循环直到完成。

我不知道为什么?我还阅读了这些:

https://nodejs.org/en/docs/guides/dont-block-the-event-loop/#blocking-the-event-loop-json-dos

https://nodejs.dev/learn/the-nodejs-event-loop#the-call-stack

以及越来越多的事件循环。但我不知道为什么当一个任务是 CPU 密集型的事件循环被冻结。 node.js 以异步方式运行,因此它不会等待任务,并且当任务完成时它会回调。因此,如果一项任务需要很长时间,那应该无关紧要。因为事件循环完成了它的工作,并且当该任务完成时发送回调。那么为什么大型任务会冻结事件循环呢?

【问题讨论】:

    标签: node.js asynchronous server nonblocking event-loop


    【解决方案1】:

    node.js 以异步方式运行,因此它不会等待任务,当任务完成时它会回调。因此,如果一项任务需要很长时间,那应该无关紧要。因为事件循环完成了它的工作,并且当该任务完成时发送回调。那么为什么大型任务会冻结事件循环呢?

    如果您告诉事件循环自己执行任务,事件循环就无法完成它的工作。

    如果您正在生成另一个 Worker 并让该 Worker 执行任务,则事件循环可以等待(处理其他事情)直到该 Worker 完成然后执行其回调,但这意味着您需要为此编写代码,生成工人不会自动完成。

    如果你没有生成worker,那么这意味着任务是由事件循环完成的,如果任务是cpu密集型的(需要大量时间来计算),那么你就会阻止事件循环完成它的工作。

    【讨论】:

      最近更新 更多