JavaScript如何解決單線程缺陷——webWorker

来源:https://www.cnblogs.com/waterrec/archive/2023/06/08/17467272.html
-Advertisement-
Play Games

# 解決JavaScript單線程問題——webWorkers > 參考文檔 [使用 Web Workers - Web API 介面參考 | MDN (mozilla.org)](https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Worker ...


解決JavaScript單線程問題——webWorkers

參考文檔 使用 Web Workers - Web API 介面參考 | MDN (mozilla.org)

MDN的介紹為:

Web Worker 為 Web 內容在後臺線程中運行腳本提供了一種簡單的方法。線程可以執行任務而不幹擾用戶界面。此外,它們可以使用 XMLHttpRequest(儘管 responseXMLchannel 屬性總是為空)或 fetch(沒有這些限制)執行 I/O。一旦創建,一個 worker 可以將消息發送到創建它的 JavaScript 代碼,通過將消息發佈到該代碼指定的事件處理器(反之亦然)。

簡單來說就是, 我們可以通過使用worker為主線程分擔數據處理壓力.
假如說你有一段很大的數據需要處理, 而你又不想這段程式阻礙你的其他操作,這時候就可以考慮一下webWorker.

如何使用webWorker

創建worker

  1. 先創建一個worker.js文件, 該文件為線程代碼文件, 文件中的代碼會在後臺線程中運行.

  2. 在主線程中創建一個worker, 通過類似通訊的方式在主線程和worker中進行數據傳遞.

    // index.js主線程代碼塊
    // 簡單創建一個worker名為myworker
    let myworker = new Worker("./firstworker.js") // 參數為firstworker.js文件的路徑
    

主線程和worker之間進行通訊

  1. 主線程發送數據給worker: 在主線程中通過 worker.prototype.postMessage() 進行通信

    // index.js主線程代碼塊
    // ... 創建完worker
    
    console.log("主線程我說句話先,接下來你要替我幹活了.");
    // 簡單向worker中發送一個數組[1, 2, 3]
    myworker.postMessage([1, 2, 3]);
    
  2. worker接收來自主線程的數據: 在myworker.js中接收數據

    // firstworker.js代碼塊
    // 接收來自主線程的數據,數組[1, 2, 3]
    onmessage = function recive(msg) {
        // 接收到的是一個MessageEvent對象, 我們可以獲取data屬性
        console.log(msg.data); // 輸出[1, 2, 3]
    };
    

    我們也可以使用更簡潔的方式

    // firstworker.js代碼塊
    // 使用解構和匿名箭頭函數
    onmessage = ({ data }) => {
      console.log(data); // 輸出[1, 2, 3]
    };
    
  3. worker發送數據給主線程: 通過 postMessage() 發送數據給主線程 index.js

    接收到數組[1, 2, 3]之後, 我們可以簡單的對數組進行一個逆序操作, 再把結果返回主線程

    // firstworker.js代碼塊
    onmessage = ({ data }) => {
        // 主線程發來的數據
        console.log("主線程發來的數據:", data);
        // 賦值一個新變數newdata
        let newdata = data;
        // 對新變數操作(數組逆序)
        newdata.sort((a, b) => {
            return b - a;
        });
        console.log("worker後臺線程處理完成的數據newdata:", newdata);
        // 處理完的結果遞交給主線程
        postMessage(newdata);
    };
    
  4. 主線程接收worker訊息: 通過 addEventListener() 對worker的動作進行監聽

    // index.js主線程代碼塊
    // 主線程通過 監聽 實例的message事件獲取worker的數據
    // 接收myworker處理之後的結果
    myworker.addEventListener("message", ({ data }) => {
        console.log("接收到來自worker處理完的數據:", data);
    });
    

關閉線程

worker.terminate()可以幫助我們在主線程中隨意關閉線程, 即為從主線程中立刻終止一個運行中的 worker

// index.js主線程代碼塊
// 3s後關閉線程
setTimeout(() => {
    console.log("關閉myworker,你別說話了")
    myWorker.terminate();
}, 3000);

// firstworker.js代碼塊
setTimeout(() => {
    console.log("4秒時讓我說句話")
}, 4000);

worker監聽

主線程通過 addEventListener() 對worker動作進行監聽, 動作包含三種

  • message
  • error
  • messageError:

註意事項

  1. worker是HTML5規範的API,所以你沒法在node環境中使用.
  2. worker沒辦法對dom元素操作, 只能在主線程中, 多線程操作dom感覺就不大好.
  3. worker可以用於執行長時間運行的計算、處理大量數據、執行網路請求等任務,而不會影響用戶界面的響應性能.幫助開發人員提高Web應用程式的性能和響應性能.
  4. 本文章只對worker的使用進行了簡單介紹, 具體進階用法等詳細內容還得參考MDN文檔(共用worker, 線程安全, 嵌入式worker等)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為了保證統計數據的準確性,比如訂單金額,一個常用的方法是在查詢時增加final關鍵字。那final關鍵字是如何合併數據的,以及合併的數據範圍是怎樣的,本文就對此做一個簡單的探索。 ...
  • 資料庫產品的成功絕對不是技術堆疊的成功,而是需要有大量的應用場景磨合才能逐步成功的。如果僅僅依靠自己那幾百個用戶,想要發展出成熟的高水平的商用資料庫產品來,那幾乎是不太能的。依靠開源社區的廣大用戶來研發自己的資料庫產品不失為一種比較好的策略。 ...
  • ## 配置AOSP docker編譯環境 ### 1.安裝docker ``` curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh ``` 參考:[github](https://github.com/docker/ ...
  • # 協程中的異常處理 ![coroutine exception handling](https://img2023.cnblogs.com/blog/325852/202306/325852-20230608084235670-684439238.png) ## Parent-Child關係 如果 ...
  • 基於electron25+vite4+vue3仿製chatgpt客戶端聊天模板ElectronChatGPT。 electron-chatgpt 使用最新桌面端技術Electron25.x結合Vite4.x全家桶技術開發跨端模仿ChatGPT智能聊天程式模板。支持經典+分欄兩種佈局、暗黑+明亮主題模 ...
  • 近期發現公司某些站點出現偶爾跳轉博彩網站的現象,經過排查發現該現象為供應鏈投毒攻擊,BootCDN上的靜態資源無一例外均被污染, 當外站引入BootCDN的靜態資源時,如果請求攜帶的Referer頭為指定值(涉及公司隱私不便透露),User-Agent頭為手機瀏覽器UA,觸發惡意代碼註入。 例如:h ...
  • Collapse 摺疊面板:通過摺疊面板收納內容區域。 1. 基礎用法 可以摺疊展開多個面板,面板之間互不影響。 示例代碼 <el-collapse v-model="activeNames" @change="handleChange"> <el-collapse-item title="一致性 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 為了保證的可讀性,本文采用意譯而非直譯。 在 JS 面試中,經常會看到一些簡單而又沙雕的題目,這些題目包含一些陷阱,但這些在我們規範的編碼下或者業務中基本不會出現。 有些面試官就是這樣,不專註於制定代碼的標準和規範上,卻用不規範的代碼去檢 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...