通过 worker_threads 模块,创建独立的 JavaScript 线程(每个线程有独立 V8 和 Event Loop)。线程间可共享内存(SharedArrayBuffer),适合 CPU 密集型任务(如图像处理、大数据计算)。
const { Worker } = require('worker_threads');
new Worker(`
const { parentPort } = require('worker_threads');
parentPort.postMessage(calculateCPUIntensiveTask());
`, { eval: true });
SharedArrayBuffer 是 JavaScript 中用于 多线程共享内存 的机制,允许不同线程直接读写同一块内存区域。它的概念类似于其他语言(如 Go、Java、C++)中的共享内存多线程编程模型,但实现方式和安全性有所不同。以下是详细对比和解析:
SharedArrayBuffer 与其他语言的共享内存多线程对比
1. SharedArrayBuffer 是什么?
核心特性
- 共享内存:多个 Worker Threads 可直接访问同一块内存
- 原子操作:通过
Atomics
API 保证线程安全 - 适用场景:高性能计算(游戏、音视频处理等)
代码示例
// 主线程
const { Worker, isMainThread, SharedArrayBuffer } = require('worker_threads');
const sharedBuffer = new SharedArrayBuffer(16);
const arr = new Uint32Array(sharedBuffer);
if (isMainThread) {
new Worker(__filename, { workerData: sharedBuffer });
arr[0] = 1; // 主线程写入
} else {
console.log(arr[0]); // Worker 线程读取
Atomics.add(arr, 0, 2); // 原子操作
}
2. 其他语言的共享内存多线程实现
(1) Go(Goroutine + 共享内存)
- 共享方式:通过 sync.Mutex 或 sync/atomic 包实现线程安全。
- 区别:Go 的 Goroutine 是轻量级线程(非系统线程),共享内存需显式加锁。
var mutex sync.Mutex
func increment() {
mutex.Lock()
counter++
mutex.Unlock()
}
2. 如何选择共享内存技术?
-
JavaScript:用 SharedArrayBuffer + Worker Threads(适用于 CPU 密集型任务)。
-
Go/Java/C++:原生锁/原子操作(适合高性能后端)。
-
Python:多进程 + 共享内存(受限于 GIL)。
-
Web:WASM + SharedArrayBuffer(跨语言高性能计算)。
总结
SharedArrayBuffer 是 JavaScript 的多线程共享内存方案,类似其他语言的原子变量或锁机制。
Go/Java/C++ 的共享内存更成熟,而 Python 因 GIL 需用多进程。
在 Web 中使用 SharedArrayBuffer 需注意安全策略,适用于 WASM 等高性能场景。