js 实现多线程
实现多线程的方式
在JavaScript中,由于语言本身的单线程特性,无法直接实现多线程。但可以通过以下方式模拟或利用多线程的能力:
Web Workers
Web Workers是浏览器提供的API,允许在后台运行脚本,独立于主线程运行。
// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage('Hello Worker');
worker.onmessage = function(e) {
console.log('Message from worker:', e.data);
};
// worker.js
self.onmessage = function(e) {
console.log('Message from main:', e.data);
self.postMessage('Hello Main');
};
SharedArrayBuffer和Atomics
用于在多个Worker之间共享内存,实现真正的数据共享。
// 主线程
const sharedBuffer = new SharedArrayBuffer(1024);
const sharedArray = new Int32Array(sharedBuffer);
const worker = new Worker('worker.js');
worker.postMessage({buffer: sharedBuffer});
// worker.js
self.onmessage = function(e) {
const sharedArray = new Int32Array(e.data.buffer);
Atomics.add(sharedArray, 0, 1);
};
Service Workers
主要用于离线缓存和网络请求拦截,但也可以实现类似多线程的效果。
// 注册Service Worker
navigator.serviceWorker.register('sw.js').then(registration => {
console.log('ServiceWorker registered');
});
// sw.js
self.addEventListener('install', event => {
console.log('Service Worker installing');
});
self.addEventListener('activate', event => {
console.log('Service Worker activating');
});
Node.js中的Worker Threads
在Node.js环境中,可以使用worker_threads模块实现多线程。
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', msg => {
console.log('Message from worker:', msg);
});
worker.postMessage('Hello Worker');
} else {
parentPort.on('message', msg => {
console.log('Message from main:', msg);
parentPort.postMessage('Hello Main');
});
}
异步编程模式
虽然不实现真正的多线程,但通过Promise、async/await等可以实现非阻塞操作。
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
}
fetchData().then(data => console.log(data));
注意事项
- Web Workers不能直接操作DOM
- 线程间通信需要通过消息传递
- SharedArrayBuffer使用时需要注意线程安全问题
- Node.js的Worker Threads适用于CPU密集型任务
- Service Workers主要用于网络相关操作
这些方法各有适用场景,需要根据具体需求选择合适的多线程实现方式。







