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