标准答案

  1. 同步 JSON 大对象处理、复杂正则、加密、压缩和循环计算都可能占满主线程。
  2. setImmediate 只能把工作拆成多个回合,不能让单次长计算自动并行。
  3. Worker Threads 适合共享较少、可并行的 CPU 计算;独立进程适合更强隔离和不同崩溃边界。
  4. 任务转移后仍需限制并发、队列和内存,并让请求有超时和取消结果。

题目解析

async/await 只改变等待结果的写法,不会把 JavaScript 计算移到其他线程。同步 JSON、复杂正则、加密、压缩和大循环仍会占用主线程,阻塞所有依赖该进程的回调。

Worker Threads 适合可拆分的 CPU 工作,独立进程适合更强的故障和资源隔离;两者都需要有界队列、并发、超时和崩溃恢复。setImmediate 只能把工作切成回合,不能让单次计算并行。

排查要把 event loop delay、CPU profile、Worker 队列、请求 P99 和下游错误对齐。平均 CPU 可能不高,但主线程的单个长任务仍会造成明显长尾。

常见误区

  • 误区:把 async function 当作 CPU 并行。改正:异步只处理等待,要并行计算需 Worker、进程或外部任务服务。
  • 误区:用无限 Worker 处理突发请求。改正:限制 Worker 数量、队列和任务内存,容量耗尽时拒绝或排队。
  • 误区:只看 CPU 平均值。改正:同时看 event loop delay、单线程 profile、P99 和任务队列。

作者信息