成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
因為 JS 是單線程(主線程)的,這意味著它一次只能做一件事。當在主線程上運行耗時較長的任務時,那么 Web 應用可能會卡住或需要一段時間才能加載。

Hello,大家好,我是 Sunday

這段時間有不少同學在面試中遇到了 web worker 的問題。所以今天咱們就通過這篇文章,把 web worker 搞明白!

Web Worker 到底是什么?

因為 JS 是單線程(主線程)的,這意味著它一次只能做一件事。當在主線程上運行耗時較長的任務時,那么 Web 應用可能會卡住或需要一段時間才能加載。如下偽代碼:

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

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

而 web worker 就可以解決掉卡頓的問題。

web worker 可以在 “后臺” 獨立執行任務,類似于開啟了一個 “子線程”,可以在不影響主線程的前提下,完成對應的計算。

如下基礎代碼(暫時不需要關心什么是 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>

它主要具備以下四個特點:

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

明確好了它的特點之后,我們來逐步解析下對應的代碼邏輯。

Web Worker 代碼解析

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

變量 self

類似于 window。因為 Web Worker 在一個不同的全局上下文中運行,所以不是我們熟悉的 window 對象。而是使用 self 來代表全局上下文

構造函數 Worker

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

方法一 onmessage

self 的常用方法之一,用來監聽 worker 事件啟動。被 實例.postMessage 觸發

方法二 postMessage

觸發 self.onmessage 的方法。可以理解為 “啟動器”。該方法 必須 接收一個參數

Web Worker 的注意事項

使用 Web Worker 時,有兩個注意事項:

  1. 無法操作 DOM: DOM 的操作必須要在主線程中進行。因為 Web Worker 是單獨開辟了線程,所以無法進行 DOM 操作
  2. Handle Errors: Web Worker 中始終包含錯誤處理來捕獲任何問題。
責任編輯:武曉燕 來源: 程序員Sunday
相關推薦

2020-06-30 10:45:28

Web開發工具

2023-12-27 08:15:47

Java虛擬線程

2021-12-17 07:47:37

IT風險框架

2022-03-26 09:06:40

ActorCSP模型

2025-02-13 08:04:49

spliceCPU數據

2024-05-16 11:13:16

Helm工具release

2009-11-09 12:55:43

WCF事務

2024-12-18 10:24:59

代理技術JDK動態代理

2024-01-16 07:46:14

FutureTask接口用法

2021-04-20 13:59:37

云計算

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2024-08-30 08:50:00

2013-06-28 14:30:26

棱鏡計劃棱鏡棱鏡監控項目

2009-10-29 16:22:10

VB.NET操作MyS

2025-04-01 01:25:00

MySQLInnoDBMyISAM

2017-11-20 10:37:03

2020-06-29 07:42:20

邊緣計算云計算技術

2023-12-04 18:13:03

GPU編程

2024-10-15 09:18:30

2009-11-05 16:04:19

Oracle用戶表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美性猛交一区二区三区精品 | 久久99精品久久久久子伦 | 一区二区三区免费 | 国产成人精品高清久久 | 日韩欧美国产成人一区二区 | 国产成人精品一区二区三区四区 | 青草青草久热精品视频在线观看 | 亚洲性在线 | 欧美日韩综合一区 | 国产精品亚洲一区二区三区在线 | 亚洲成人久久久 | 亚洲视频免费观看 | 国产精品亚洲一区 | 在线免费观看黄色av | 天天玩天天操天天干 | 在线视频日韩 | 一区二区三区在线 | 欧美精品一区二区三区在线播放 | 久久亚洲国产精品日日av夜夜 | 97av在线| 97视频免费| 91精品国产一区二区三区 | 天天宗合网 | 日本午夜精品一区二区三区 | 99精品一级欧美片免费播放 | 免费a级毛片在线播放 | 亚洲国产精品va在线看黑人 | 色综合一区 | 久久久成人精品 | 欧美一区二区三区四区五区无卡码 | 日韩精品亚洲专区在线观看 | av网站免费观看 | 午夜小视频免费观看 | 久久精品亚洲精品国产欧美 | 久久综合久久综合久久 | 久久婷婷麻豆国产91天堂 | 国产欧美久久一区二区三区 | 久久久91精品国产一区二区三区 | 欧美国产视频 | 国产欧美日韩综合精品一区二区 | 国产乱肥老妇国产一区二 |