js怎么实现并发
实现并发的方法
JavaScript 是单线程语言,但可以通过以下方式模拟并发执行:
使用 Web Workers
Web Workers 允许在后台线程中运行脚本,避免阻塞主线程。创建一个 worker 并与之通信:
// 主线程
const worker = new Worker('worker.js');
worker.postMessage('start');
worker.onmessage = (e) => {
console.log('Received:', e.data);
};
// worker.js
self.onmessage = (e) => {
console.log('Worker received:', e.data);
self.postMessage('done');
};
使用 Promise 和 async/await
通过 Promise.all 或 Promise.allSettled 并行执行多个异步操作:
async function fetchAll() {
const [res1, res2] = await Promise.all([
fetch('https://api.example.com/data1'),
fetch('https://api.example.com/data2')
]);
const data1 = await res1.json();
const data2 = await res2.json();
console.log(data1, data2);
}
使用 setTimeout 或 setInterval
虽然 JavaScript 是单线程,但可以通过事件循环模拟并发:
setTimeout(() => console.log('Task 1'), 0);
setTimeout(() => console.log('Task 2'), 0);
使用 Generator 函数
通过生成器函数实现协程风格的并发:
function* tasks() {
yield task1();
yield task2();
}
const iterator = tasks();
iterator.next();
iterator.next();
使用事件发射器(EventEmitter)
Node.js 中可以通过事件驱动实现并发:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('event', () => console.log('Event handled'));
emitter.emit('event');
使用集群(Cluster)
Node.js 中利用多核 CPU 的集群模块:
const cluster = require('cluster');
if (cluster.isMaster) {
cluster.fork();
cluster.fork();
} else {
// Worker code
}
注意事项
- Web Workers 无法直接访问 DOM
- Promise 并非真正的并行,而是异步调度
- 在 Node.js 中可以使用
child_process或worker_threads实现更高级的并发







