You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js长循环场景下阻塞的是Event loop还是CPU?

示例代码:

exports.products = (req, res) => {
  let el = 1;
  for (let i = 0; i < 100000000000000; i++) {
    el += i;
  }
  console.log(el);

  ...

  res.redirect('/');
};

结论

这是典型的 Node.js Event Loop 被阻塞 导致的问题,和处理器算力不足无关。

原理说明

Node.js 的 JavaScript 代码默认运行在单主线程上,所有业务逻辑执行、HTTP 请求解析、响应返回、异步回调调度都依赖主线程的 Event Loop 轮询机制完成。只要主线程被同步任务占住,Event Loop 就会停止调度,所有待处理的任务都会进入排队状态,不会被执行。

你提供的代码里包含了一个高达100万亿次的同步长循环,一旦这个接口被触发,循环会直接占满主线程的所有可用时间片,直到循环执行完毕前:

  • 触发该接口的请求无法拿到响应,一直处于加载状态
  • 后续所有进入该 Node 进程的其他请求,哪怕和这个接口完全无关,也会因为主线程被占住得不到处理,表现为全链路卡顿无响应
  • 进程CPU占用率拉满是这个同步循环跑满CPU计算的伴随现象,本质还是主线程阻塞导致的结果

为什么不是算力不足

哪怕使用当前最顶级的桌面/服务器处理器,运行这个同步长循环时一样会出现全链路卡顿的现象,和算力没有直接关联。如果是算力不足,表现应该是所有请求的响应耗时普遍变长,但不会出现某一个接口触发后所有请求完全无响应的情况。

常见解决方案

如果业务侧确实有这类CPU密集型长运算需求,可以用两种方式避免阻塞Event Loop:

  • 把长运算逻辑放到 worker_threads 子线程中执行,运算完成后再通过事件通知主线程返回结果
  • 把长循环拆成多个小批次运算,每执行完一个批次就用 setImmediate 让出主线程,给Event Loop调度其他任务的机会

内容的提问来源于stack exchange,提问作者Sha'an

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:45:01