JavaScript 是一种单线程语言,这意味着任务在主线程上一次执行一个。虽然这种设计简化了开发,但它可能会导致计算繁重的任务出现性能瓶颈。本博客探讨了 Web Workers、SharedArrayBuffer 和 Atomics 如何在 JavaScript 中启用多线程来构建高性能应用程序。
Web Workers 在后台线程中运行 JavaScript,防止密集型任务阻塞用户交互,例如滚动或按钮单击。
SharedArrayBuffer 允许主线程和工作线程之间共享内存,无需复制,从而实现更快的通信。
原子确保对共享内存的安全和同步访问,防止竞争条件并保持线程之间的数据一致性。
示例:使用 Web Workers 和 SharedArrayBuffer 的实际任务
让我们实现一个简单且真实的示例:并行计算大型数组的总和。
第 1 步:创建 Web Worker 脚本
创建一个名为worker.js的文件来处理部分求和计算:
// worker.js self.onmessage = function (event) { const { array, start, end } = event.data; let sum = 0; for (let i = start; i < end; i++) { sum += array[i]; } self.postMessage(sum); };
第 2 步:设置主线程
在主脚本中,将任务分配给worker。
// main.js const array = Array.from({ length: 1_000_000 }, () => Math.floor(Math.random() * 100)); const numWorkers = 4; const chunkSize = Math.ceil(array.length / numWorkers); const workers = []; const results = []; let completedWorkers = 0; // Create a SharedArrayBuffer for the array const sharedBuffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * array.length); const sharedArray = new Int32Array(sharedBuffer); sharedArray.set(array); // Initialize workers for (let i = 0; i < numWorkers; i++) { const worker = new Worker('worker.js'); workers.push(worker); const start = i * chunkSize; const end = Math.min(start + chunkSize, array.length); worker.postMessage({ array: sharedArray, start, end }); worker.onmessage = function (event) { results[i] = event.data; completedWorkers++; if (completedWorkers === numWorkers) { const totalSum = results.reduce((acc, curr) => acc + curr, 0); console.log('Total Sum:', totalSum); } }; }
第 3 步:使用原子进行同步
使用 Atomics 来管理进度或确保所有线程在继续之前都已完成。
const progress = new Int32Array(sharedBuffer); Atomics.add(progress, 0, 1); // Increment progress if (Atomics.load(progress, 0) === numWorkers) { console.log('All workers completed their tasks.'); }
流畅的用户体验:从主线程卸载计算。
更快的通信: SharedArrayBuffer 避免了线程之间的数据复制。
线程安全:原子提供了有效处理同步的工具。
实时分析:并行处理大型数据集以获得更快的洞察力。
游戏引擎:在单独的线程中执行物理模拟。
媒体处理:编码或解码视频流,没有 UI 延迟。
参考文献
MDN Web 文档:Web Workers
MDN 网络文档:SharedArrayBuffer
MDN 网络文档:原子
以上是简化的高性能 JavaScript:Web Workers、SharedArrayBuffer 和 Atomics的详细内容。更多信息请关注PHP中文网其他相关文章!