Deno 是一个新兴的宿主环境,它基于V8引擎和Rust构建,旨在提供更安全、更简单和更现代化的JavaScript和TypeScript应用程序开发环境。Web Workers 是一项运行在浏览器和 Node.js 中的技术,它可以在独立的线程中运行 JavaScript 代码,以便更好地利用 CPU 和减少阻塞现象。在 Deno 中,我们同样可以使用 Web Workers 来实现类似的效果。
创建 Web Worker
在 Deno 中,我们可以使用 Deno
模块的 Worker
类来创建一个 Web Worker。Worker
类的构造函数接受一个参数,即要运行的 JavaScript 文件的 URL。假设我们要创建一个名为 worker.ts
的文件,其中包含以下代码:
addEventListener('message', (event) => { console.log('Worker received message: ', event.data); const fibonacci = (num: number): number => num <= 1 ? 1 : fibonacci(num - 1) + fibonacci(num - 2); const result = fibonacci(event.data); postMessage(result); });
这是一个计算斐波那契数列的 Web Worker。它监听主线程发送的消息事件,并根据消息中的数字计算出相应的斐波那契数,最终将结果通过 postMessage
方法发送回主线程。
现在,我们可以在主线程中使用如下代码创建一个 Web Worker 并发送消息到其中去:
const worker = new Worker('worker.ts', { type: 'module' }); worker.addEventListener('message', (event) => { console.log('Main thread received message: ', event.data); }); worker.postMessage(15);
这里我们创建了一个名为 worker
的 Web Worker,并将 15
作为消息发送到其中去。Web Worker 收到消息后会执行自己的逻辑,最终将计算出来的结果通过 postMessage
方法发送回主线程。主线程通过监听 message
事件来接收来自 Web Worker 的消息。
共享内存和 Atomics
在 Web Workers 中,运行在独立的线程中的代码不能访问主线程的内存,反之亦然。但如果需要在多个线程之间共享内存,可以使用共享内存和原子操作来实现。
Deno 中的 Worker
类提供了一个名为 SharedArrayBuffer
的构造函数,可以用来创建共享内存。以一个简单的例子来说明如何使用共享内存:
-- -------------------- ---- ------- ----- ------ - --- --------------------- ----- ----------- - --- ------------------- -------------- - -- ----- ------ - --- ------------------- - ----- -------- --- -------------------------------- ---------------------------------- ------- -- - ----------------- ------ -------- -------- -- ---------------- ---
这里我们创建了一个名为 buffer
的共享内存,其大小为 4 字节。我们还创建了一个名为 sharedArray
的整型数组,它是 buffer
的视图。我们将 sharedArray[0]
的值初始化为 0
,之后将其作为消息发送给了 Web Worker。
在 worker.ts
文件中,我们需要对共享内存进行操作:
addEventListener('message', (event) => { const sharedArray = event.data; const view = new Int32Array(sharedArray); Atomics.add(view, 0, 1); postMessage('done'); });
这里我们获取了主线程传递过来的 sharedArray
,通过 Atomics.add
方法将 view[0]
的值 +1 并返回新值。最终我们将一个字符串 'done'
作为消息发送回主线程。
在主线程中,我们按照之前的方式监听 message
事件,并打印出共享内存中的值。由于 Atomics.add
方法是原子的,因此可以保证多个线程同时对其进行操作时不会发生冲突。
结束 Worker
在使用完 Web Worker 后,我们需要将其终止,以释放资源。我们可以使用 terminate()
方法来手动终止一个 Web Worker:
const worker = new Worker('worker.ts', { type: 'module' }); // some code here... worker.terminate();
总结
使用 Web Workers 可以让我们在 Deno 中更好地处理复杂的计算任务,提高应用程序的性能和稳定性。通过共享内存技术和原子操作,我们可以让多个线程并发执行,并且保证线程之间的执行不会相互影响。现在,你可以开始在 Deno 中尝试使用 Web Workers,以提升自己的前端开发能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6460d11e968c7c53b026e096