自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開(kāi)啟 JS 的 “多線程”,三分鐘掌握 Web Worker。面試必備!

開(kāi)發(fā) 前端
因?yàn)?JS 是單線程(主線程)的,這意味著它一次只能做一件事。當(dāng)在主線程上運(yùn)行耗時(shí)較長(zhǎng)的任務(wù)時(shí),那么 Web 應(yīng)用可能會(huì)卡住或需要一段時(shí)間才能加載。

Hello,大家好,我是 Sunday

這段時(shí)間有不少同學(xué)在面試中遇到了 web worker 的問(wèn)題。所以今天咱們就通過(guò)這篇文章,把 web worker 搞明白!

Web Worker 到底是什么?

因?yàn)?JS 是單線程(主線程)的,這意味著它一次只能做一件事。當(dāng)在主線程上運(yùn)行耗時(shí)較長(zhǎng)的任務(wù)時(shí),那么 Web 應(yīng)用可能會(huì)卡住或需要一段時(shí)間才能加載。如下偽代碼:

<div class="box">hello</div>
for (let i = 0; i < 1000000; i++) {
  console.log(i)
}

document.querySelector('.box').innerHTML = '程序員Sunday'

而 web worker 就可以解決掉卡頓的問(wèn)題。

web worker 可以在 “后臺(tái)” 獨(dú)立執(zhí)行任務(wù),類似于開(kāi)啟了一個(gè) “子線程”,可以在不影響主線程的前提下,完成對(duì)應(yīng)的計(jì)算。

如下基礎(chǔ)代碼(暫時(shí)不需要關(guān)心什么是 slef、postMessage 或者 onmessage):

// worker.js
self.onmessage = () => {
 for (let i = 0; i < 1000000; i++) {
  console.log(i)
 }
}
// index.html
<script>
  const worker = new Worker('./worker.js')
  worker.postMessage(1)

  document.querySelector('.box').innerHTML = '程序員Sunday'
</script>

它主要具備以下四個(gè)特點(diǎn):

  1. 并行執(zhí)行:Web Worker 允許在不同線程中并行處理任務(wù),不會(huì)干擾主線程的執(zhí)行。這對(duì)于需要大量計(jì)算或需要處理大量數(shù)據(jù)的應(yīng)用特別有用。
  2. 不共享全局對(duì)象:每個(gè) Web Worker 都有自己的全局上下文(self),并且不能直接訪問(wèn)主線程的 DOM 或其他全局對(duì)象。它們通過(guò)消息傳遞來(lái)與主線程或其他 Web Workers 進(jìn)行通信。
  3. 線程安全:由于 Web Workers 在自己的線程中運(yùn)行,并且沒(méi)有直接訪問(wèn)共享內(nèi)存的能力,這減少了多線程編程中的常見(jiàn)問(wèn)題(如:競(jìng)態(tài)問(wèn)題)。
  4. 消息傳遞機(jī)制:主線程和 Web Worker 之間通過(guò) postMessage 和 onmessage 事件來(lái)進(jìn)行數(shù)據(jù)交換。主線程使用 worker.postMessage() 發(fā)送消息,Web Worker 使用 self.onmessage 處理消息。

明確好了它的特點(diǎn)之后,我們來(lái)逐步解析下對(duì)應(yīng)的代碼邏輯。

Web Worker 代碼解析

想要使用 Web Worker,那么需要先明確 一個(gè)變量、一個(gè)構(gòu)造、兩個(gè)方法:

變量 self

類似于 window。因?yàn)?Web Worker 在一個(gè)不同的全局上下文中運(yùn)行,所以不是我們熟悉的 window 對(duì)象。而是使用 self 來(lái)代表全局上下文

構(gòu)造函數(shù) Worker

想要使用 Web Worker 那么必須要生成 Worker 實(shí)例。該構(gòu)造函數(shù)接收 一個(gè)JS文件的路徑。該路徑就是書寫 Web Worker 代碼的位置

方法一 onmessage

self 的常用方法之一,用來(lái)監(jiān)聽(tīng) worker 事件啟動(dòng)。被 實(shí)例.postMessage 觸發(fā)

方法二 postMessage

觸發(fā) self.onmessage 的方法??梢岳斫鉃?“啟動(dòng)器”。該方法 必須 接收一個(gè)參數(shù)

Web Worker 的注意事項(xiàng)

使用 Web Worker 時(shí),有兩個(gè)注意事項(xiàng):

  1. 無(wú)法操作 DOM: DOM 的操作必須要在主線程中進(jìn)行。因?yàn)?Web Worker 是單獨(dú)開(kāi)辟了線程,所以無(wú)法進(jìn)行 DOM 操作
  2. Handle Errors: Web Worker 中始終包含錯(cuò)誤處理來(lái)捕獲任何問(wèn)題。
責(zé)任編輯:武曉燕 來(lái)源: 程序員Sunday
相關(guān)推薦

2023-12-27 08:15:47

Java虛擬線程

2021-12-17 07:47:37

IT風(fēng)險(xiǎn)框架

2020-06-30 10:45:28

Web開(kāi)發(fā)工具

2025-02-13 08:04:49

spliceCPU數(shù)據(jù)

2022-03-26 09:06:40

ActorCSP模型

2024-05-16 11:13:16

Helm工具release

2009-11-09 12:55:43

WCF事務(wù)

2024-12-18 10:24:59

代理技術(shù)JDK動(dòng)態(tài)代理

2022-02-17 09:24:11

TypeScript編程語(yǔ)言javaScrip

2021-04-20 13:59:37

云計(jì)算

2024-01-16 07:46:14

FutureTask接口用法

2024-08-30 08:50:00

2013-06-28 14:30:26

棱鏡計(jì)劃棱鏡棱鏡監(jiān)控項(xiàng)目

2009-10-29 16:22:10

VB.NET操作MyS

2025-04-01 01:25:00

MySQLInnoDBMyISAM

2017-11-20 10:37:03

2024-10-15 09:18:30

2021-02-03 14:31:53

人工智能人臉識(shí)別

2024-01-12 07:38:38

AQS原理JUC

2024-07-05 09:31:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)