網站首頁 編程語言 正文
前端手中最重要的一把劍,就是JavaScript。
然而JavaScript是單線程運行的,在同一時間內只能執行一個任務。當JavaScript處理的程序越來越復雜的時候,需要處理的任務涉及大規模CPU運算,比如圖像、視頻的解析。單線程運行就會容易造成UI阻塞、頁面卡頓這些問題。
所以瀏覽器、Node都引入了多線程模式。瀏覽器的多線程模式是HTML5規范,Node多線程是Node官方模塊。
瀏覽器多線程——Web Worker
在瀏覽器中通過Web Worker使用多線程,在Web Worker線程中,直接運行JavaScript代碼,但是不能操作DOM節點,也不能使用window對象的默認方法和屬性、不能使用webSockets,IndexedDB這些數據存儲機制。
首先在腳本里面使用new Worker語句創建一個Worker線程。然后主線程或者Worker線程中,可以通過postMessage方法向另一個線程發送消息,使用onmessage事件函數來接受另一個線程發送的消息。比如:
Worker線程是分為專用Worker線程和共享Worker線程,專用線程是是有一個父線程,共享線程可以有多個父線程。
專用Worker線程
現在有這樣的一個代碼,需要計算1到300000000000的總和,打開瀏覽器,在代碼運行期間,瀏覽器會陷入卡頓,如下圖所示:
這樣時間久了,瀏覽器會崩潰的。
所以我們要把涉及到大量運算的任務放到Worker線程中執行,這樣就不阻塞UI的渲染了,現在在a.js中創建代碼,如下:
console.time("主線程占用時長");
let worker = new Worker("./b.js");
worker.onmessage = function (event) {
console.log('計算結果: ' + event.data);
}
let runTimes = 300000000;
worker.postMessage(runTimes);
console.timeEnd("主線程占用時長");
b.js代碼為:
self.onmessage = function (event) {
console.time("Worker線程占用時長");
let result = 0;
for (let i = 0; i < event.data; i++) {
result += i;
}
self.postMessage(result);
console.timeEnd("Worker線程占用時長");
}
執行效果如下:
等到Worker線程的任務執行完成,會打印結果,如下圖:
這樣大大降低主線程的負擔。
處理錯誤
在主線程里面監聽Worker線程是否出錯。相關的參數如下:
- message:錯誤消息
- filename:發生錯誤的腳本文件名
- lineono:錯誤在腳本中的行號
對上面的代碼稍作調整:
let worker = new Worker("b.js");
worker.onmessage = function (event) {
console.log(`Result is "${event.data}"`);
};
worker.onerror = function (event) {
console.log("message: " + event.message);
console.log("filename: " + event.filename);
console.log("lineno: " + event.lineno);
}
worker.postMessage(null);
然后,b.js拋出一個錯誤:
self.onmessage = function (event) {
throw new Error("Something wrong!");
};
效果如下:
原文鏈接:https://blog.csdn.net/xuelian3015/article/details/131777131
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-08-18 R語言使用cgdsr包獲取TCGA數據示例詳解_R語言
- 2022-05-20 springboot-mybatis實現增刪改查
- 2022-11-18 詳解SFTP命令_linux shell
- 2022-04-09 cas5 編譯安裝依賴時提示: Failure to find net.shibboleth.too
- 2022-08-19 python模塊和函數幫助文檔快速查看方法示例_python
- 2022-05-17 NoSQL中的“BASE”特性
- 2022-11-19 ElasticSearch事件查詢語言EQL操作_服務器其它
- 2022-03-27 PostgreSQL中的日期/時間函數詳解_PostgreSQL
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支