async函数不处理cpu密集型并行计算,因js主线程单线程;需用web worker(浏览器)或worker threads(node.js)实现真正并行,而promise.all仅优化i/o并发等待,无法加速纯计算。

JavaScript 中 async 函数本身不直接处理 CPU 密集型的“并行计算”,因为 JS 主线程是单线程的,async/await 仅用于协调异步 I/O(如网络请求、定时器、文件读取等),而非真正并行执行耗 CPU 的计算任务。要实现并行计算,必须脱离主线程——这是关键前提。
并行计算 ≠ 并发异步
很多人混淆这两个概念:
- 并发异步:多个 Promise 同时发起(如 fetch)、等待完成,靠事件循环调度,仍是单线程,适合 I/O 场景;
- 并行计算:多个 CPU 密集任务(如大数组排序、图像处理、加密解密)在不同线程上物理同时运行,需 Web Worker(浏览器)或 Worker Threads(Node.js)。
浏览器中用 Web Worker 实现并行计算
主线程不能被阻塞,所以把重计算逻辑移到 Worker 中,再用 async/await 封装通信过程:
- 创建一个
worker.js文件,写纯计算逻辑(无 DOM、无 this); - 主线程中新建
new Worker('worker.js'),用postMessage发送数据; - 用
Promise包裹message事件,配合await等待结果。
示例(主线程):
async function runHeavyCalc(data) {
return new Promise((resolve, reject) => {
const worker = new Worker('calc-worker.js');
worker.onmessage = (e) => resolve(e.data);
worker.onerror = (err) => reject(err);
worker.postMessage(data); // 发送原始数据
});
}
<p>// 调用时可 await
const result = await runHeavyCalc([/<em> 100 万条数字 </em>/]);</p>Node.js 中用 Worker Threads 实现并行计算
Node.js 提供 worker_threads 模块,支持真正的多线程:
- 每个 Worker 拥有独立 V8 实例和内存空间;
- 主线程与 Worker 通过
parentPort和workerData通信; - 可结合
Promise+await封装调用,保持代码简洁。
示例(主线程):
import { Worker, isMainThread, parentPort, workerData } from 'worker_threads';
<p>if (!isMainThread) {
// Worker 内部:执行计算
const result = heavySort(workerData.array);
parentPort.postMessage(result);
}</p><p>// 主线程调用
function runInWorker(array) {
return new Promise((resolve) => {
const worker = new Worker(__filename, { workerData: { array } });
worker.on('message', resolve);
});
}</p><p>const sorted = await runInWorker(largeArray);</p>什么时候该用 Promise.all?什么时候不该?
Promise.all 不提升计算速度,只优化 I/O 等待时间。它对纯计算无效:
- ✅ 适合:
fetch、fs.readFile、setTimeout等异步操作并行发起; - ❌ 不适合:直接在主线程里
await Promise.all([sort(arr1), sort(arr2)])—— 这仍是串行计算,只是“看起来并行”,实际会卡死主线程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











