async/await 本身不能让 CPU 密集型任务异步,需配合 WorkerThreads 实现真正多线程;它仅封装消息通信为 Promise,使调用可 await、可 try/catch,避免阻塞事件循环。

async/await 本身不能让 CPU 密集型任务“变异步”,但它能完美封装 WorkerThreads 的消息通信流程,让多线程计算像调用普通异步函数一样自然、可 await、可 try/catch。
为什么 async/await 需要和 WorkerThreads 配合
Node.js 主线程是单线程的,async/await 只是对 Promise 的语法糖,不创建新线程。一个耗时 2 秒的质数筛或 JSON Schema 校验,即使写成 async 函数,仍会阻塞事件循环——因为计算本身是同步执行的。WorkerThreads 才是真正把计算移出主线程的机制;async/await 的作用是把 worker.postMessage + 监听 message 的繁琐流程,包装成简洁、符合直觉的异步调用风格。
标准封装模式:返回 Promise 的 worker 调用函数
核心是:主线程中每次 new Worker 后,立即用 Promise 封装其生命周期,resolve 对应 message,reject 对应 error/exit 异常。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用 workerData 传入初始参数(如待处理数据、配置项),避免序列化大对象
- 监听 worker.on('message') 获取结果,触发 resolve
- 监听 worker.on('error') 和 worker.on('exit') 捕获异常,确保 reject 不遗漏
- 不要在 worker 内直接操作 req/res 或全局状态,只做纯数据计算
实际使用示例:在 Express 路由中调用
比如提供一个 /hash 接口,对用户提交的长文本做 SHA-256 计算:
立即学习“Java免费学习笔记(深入)”;
- 主线程(server.js)定义 async 函数:async function computeHash(text) { ... },内部启动 worker 并 return Promise
- 路由中直接 await:const hash = await computeHash(req.body.content);
- 错误统一处理:try { ... } catch (err) { res.status(500).send(err.message); }
进阶建议:避免频繁创建 worker
每个 new Worker 有开销(V8 实例初始化、内存分配),高频请求下应搭配线程池使用:
- 预创建固定数量 worker(如等于 CPU 核心数),空闲时保持运行
- 用队列管理待处理任务,worker 完成后主动发消息表示“就绪”,调度器再分发下一个任务
- npm 包如 node-worker-threads-pool 或自建简易池可省去重复轮子
- 若任务轻量(

















