亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

精讀《談?wù)?Web Workers》

myeveryheart / 1468人閱讀

摘要:可以將耗時(shí)任務(wù)拆解出去,降低主線程的壓力,避免主線程無(wú)響應(yīng)。主線程接收發(fā)消息每個(gè)實(shí)例通過接收消息,通過發(fā)送消息。收發(fā)主線程消息和主線程代碼類似,在代碼中,也是接收消息,這個(gè)消息來自主線程或者其它。

1 引言

本周精讀的文章是 speedy-introduction-to-web-workers,是一篇 Web Workers 快速入門的文章,借精讀這篇文章的機(jī)會(huì),談?wù)剬?duì) Web Workers 的理解與運(yùn)用。

2 概述
就像分工,你只負(fù)責(zé)編碼,而你的朋友負(fù)責(zé)設(shè)計(jì),那你就可以專心把自己的事情做好,而且更快速的完成任務(wù)。

本文通過一個(gè)比方,描述了 Web Workers 的兩大特征:

高效。

并行。

因?yàn)闉g覽器是單線程的,任何大量耗時(shí)的 JS 任務(wù)都會(huì)卡住界面,使瀏覽器無(wú)法響應(yīng)任何操作,這樣的用戶體驗(yàn)非常糟糕。Web Workers 可以將耗時(shí)任務(wù)拆解出去,降低主線程的壓力,避免主線程無(wú)響應(yīng)。

但 CPU 資源是有限的,Web Workers 并不能增加總體運(yùn)行效率,算上通信的損耗,整體計(jì)算效率會(huì)有一定的下降。
創(chuàng)建 Web Workers
const worker = new Worker("../src/worker.js");

上述代碼中,worker 就是一個(gè) Web Workers 實(shí)例,執(zhí)行的代碼是 ../src/worker.js 路徑下的文件。

收發(fā)消息

Web Workers 用來執(zhí)行異步腳本,只要掌握了它與主線程通信的方式,就可以在指定時(shí)機(jī)運(yùn)行異步腳本,并在運(yùn)行完時(shí)將結(jié)果傳遞給主線程。

主線程接收發(fā) Web Workers 消息
const worker = new Worker("../src/worker.js");

worker.onmessage = e => {};

worker.postMessage("Marco!");

每個(gè) worker 實(shí)例通過 onmessage 接收消息,通過 postMessage 發(fā)送消息。

Web Workers 收發(fā)主線程消息
self.onmessage = e => {};

self.postMessage("Marco!");

和主線程代碼類似,在 Web Workers 代碼中,也是 onmessage 接收消息,這個(gè)消息來自主線程或者其它 Workers。也可以通過 postMessage 發(fā)送消息。

銷毀 Web Workers
worker.terminate();

文章內(nèi)容就這么多,是不是有寫太簡(jiǎn)單了呢!筆者結(jié)合自己的使用經(jīng)驗(yàn),再補(bǔ)充一些知識(shí)。

3 精讀 對(duì)象轉(zhuǎn)移(Transferable Objects)

對(duì)象轉(zhuǎn)移就是將對(duì)象引用零成本轉(zhuǎn)交給 Web Workers 的上下文,而不需要進(jìn)行結(jié)構(gòu)拷貝。

這里要解釋的是,主線程與 Web Workers 之間的通信,并不是對(duì)象引用的傳遞,而是序列化/反序列化的過程,當(dāng)對(duì)象非常龐大時(shí),序列化和反序列化都會(huì)消耗大量計(jì)算資源,降低運(yùn)行速度。

上面的圖充分證明了,大對(duì)象傳遞,使用對(duì)象轉(zhuǎn)移各項(xiàng)指標(biāo)都優(yōu)于結(jié)構(gòu)拷貝。

對(duì)象轉(zhuǎn)移使用方式很簡(jiǎn)單,給 postMessage 增加一個(gè)參數(shù),把對(duì)象引用傳過去即可:

var ab = new ArrayBuffer(1);
worker.postMessage(ab, [ab]);

瀏覽器兼容性也不錯(cuò):Currently Chrome 17+, Firefox, Opera, Safari, IE10+。更具體內(nèi)容,可以看 Transferable Objects: Lightning Fast!。

需要注意的是,對(duì)象引用轉(zhuǎn)移后,原先上下文就無(wú)法訪問此對(duì)象了,需要在 Web Workers 再次將對(duì)象還原到主線程上下文后,主線程才能正常訪問被轉(zhuǎn)交的對(duì)象。
如何不用 JS 文件創(chuàng)建 Web Workers

Web Workers 優(yōu)勢(shì)這么大,但用起來需要在同域下創(chuàng)建一個(gè) JS 文件實(shí)在不方便,尤其在前后端分離做的比較徹底的團(tuán)隊(duì),前端團(tuán)隊(duì)能控制的僅僅是一個(gè) JS 文件。那么下面給出幾個(gè)不用 JS 文件,就創(chuàng)建 Web Workers 的方法:

webpack 插件 - worker-loader

worker-loader 是一個(gè) webpack 插件,可以將一個(gè)普通 JS 文件的全部依賴提取后打包并替換調(diào)用處,以 Blob 形式內(nèi)聯(lián)在源碼中。

import Worker from "worker-loader!./file.worker.js";

const worker = new Worker();

上述代碼的魔術(shù)在于,轉(zhuǎn)化成下面的方式執(zhí)行:

const blob = new Blob([codeFromFileWorker], { type: "application/javascript" });
const worker = new Worker(URL.createObjectURL(blob));
Blob URL

第二種方式由第一種方式自然帶出:如果不想用 webpack 插件,那自己通過 Blob 的方式創(chuàng)建也可以:

const code = `
  importScripts("https://xxx.com/xxx.js");
  self.onmessage = e => {};
`;

const blob = new Blob([code], { type: "application/javascript" });
const worker = new Worker(URL.createObjectURL(blob));

看上去代碼更輕量一些,不過問題是當(dāng)遇到復(fù)雜依賴時(shí),如果不能把依賴都轉(zhuǎn)化為腳本通過 importScripts 方式引用,就無(wú)法訪問到主線程環(huán)境中的包。如果真的遇到了這個(gè)問題,可以用第一種 webpack 插件的方式解決,這個(gè)插件會(huì)自動(dòng)把文件所有依賴都打包進(jìn)源碼。

管理 postMessage 隊(duì)列

為什么 postMessage 會(huì)形成隊(duì)列,為什么要管理它?

首先在 Web Workers 架構(gòu)設(shè)計(jì)上就必須做成隊(duì)列,因?yàn)檎{(diào)用 postMessage 時(shí),對(duì)應(yīng)的 Web Workers 不一定完成了初始化,所以瀏覽器底層必須管理一個(gè)隊(duì)列,在 Web Workers 初始化完畢時(shí),依次消費(fèi),這樣才能確保任何時(shí)候發(fā)出的 postMessage 都能被 Web Workers 接收到。

其次,為什么要手動(dòng)維護(hù)這個(gè)隊(duì)列,原因可能取決于如下幾點(diǎn):

業(yè)務(wù)原因,前面的 postMessage 還沒來得及消費(fèi),就不要發(fā)送新的消息,或者丟棄新的消息,這時(shí)候需要通過雙向通信拿到 Web Workers 的執(zhí)行結(jié)果回執(zhí),手動(dòng)控制隊(duì)列。

性能原因,一般 Web Workers 都會(huì)被用來執(zhí)行耗時(shí)的同步運(yùn)算,如果運(yùn)算時(shí)間比較長(zhǎng),那短期塞入多個(gè)消息隊(duì)列是沒有意義的。

如上圖所示,對(duì)于每次用戶輸入都要進(jìn)行的 SQL Parser 很耗時(shí),及時(shí)放在 Web Workers 也可能導(dǎo)致將 Workers 撐爆到無(wú)響應(yīng),這是不僅要使用多 Workers 緩沖池,還要對(duì)待執(zhí)行隊(duì)列進(jìn)行過濾,因?yàn)橛脩粲肋h(yuǎn)只關(guān)心最后一次輸入的 Parser 結(jié)果。

由于 Web Workers 運(yùn)算被卡住時(shí),除了銷毀 Worker 沒有別的辦法,而銷毀 Worker 的成本比較高,不能對(duì)每一個(gè)用戶輸入都銷毀并新建 Web Workers,所以利用 Workers 緩沖池,當(dāng)緩沖池滿了,新的消費(fèi)隊(duì)列又進(jìn)來的時(shí)候,可以銷毀全部 Workers 緩沖池,換一批新緩沖池重新消費(fèi)用戶輸入。

4 總結(jié)

Web Workers 是拆解異步計(jì)算的好幫手,vscode 網(wǎng)頁(yè)版也通過 Web Workers 異步完成代碼提示和高亮,筆者有對(duì)比過,發(fā)現(xiàn) Web Workers 性能提升非常明顯。

管理好你的 Web Workers 消息隊(duì)列,謹(jǐn)防同步計(jì)算讓 Web Workers 失去響應(yīng)!建立一個(gè)智能的消息隊(duì)列,根據(jù)業(yè)務(wù)需求設(shè)計(jì)一個(gè)最好的隊(duì)列消費(fèi)模型吧!

5 更多討論
討論地址是:精讀《談?wù)?Web Workers》 · Issue #108 · dt-fe/weekly

如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。前端精讀 - 幫你篩選靠譜的內(nèi)容。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98545.html

相關(guān)文章

  • 如何機(jī)制地回答瀏覽器兼容性問題

    摘要:前言有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對(duì)于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對(duì)瀏覽器的兼容性有了解過嗎,那么如何才是我們正確回答這個(gè)問題的姿勢(shì)呢。 前言 有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對(duì)于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對(duì)瀏覽器的兼容性有了解過嗎,那么如...

    leanote 評(píng)論0 收藏0
  • 如何機(jī)制地回答瀏覽器兼容性問題

    摘要:前言有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對(duì)于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對(duì)瀏覽器的兼容性有了解過嗎,那么如何才是我們正確回答這個(gè)問題的姿勢(shì)呢。 前言 有過面試經(jīng)驗(yàn)的同學(xué)應(yīng)該都被問過瀏覽器兼容性的問題,對(duì)于面試官的問題,常常猝不及防,因?yàn)橥ǔK麄兌际沁@么問的。來談?wù)劄g覽器兼容的問題吧,你對(duì)瀏覽器的兼容性有了解過嗎,那么如...

    Rindia 評(píng)論0 收藏0
  • 精讀《Monorepo 的優(yōu)勢(shì)》

    摘要:引言本周精讀的文章是。精讀總的來說,雖然拆分子倉(cāng)庫(kù)拆分子包是進(jìn)行項(xiàng)目隔離的天然方案,但當(dāng)倉(cāng)庫(kù)內(nèi)容出現(xiàn)關(guān)聯(lián)時(shí),沒有任何一種調(diào)試方式比源碼放在一起更高效。前端精讀幫你篩選靠譜的內(nèi)容。 1. 引言 本周精讀的文章是 The many Benefits of Using a Monorepo。 現(xiàn)在介紹 Monorepo 的文章很多,可以分為如下幾類:直接介紹 Lerna API 的;介紹如何...

    xcc3641 評(píng)論0 收藏0
  • 精讀《現(xiàn)代 js 框架存在的根本原因》

    摘要:官方規(guī)范估計(jì)很難出現(xiàn)現(xiàn)代框架的設(shè)計(jì)了,因?yàn)楣俜皆O(shè)計(jì)中前端三劍客是相互分離的方案,為了解決現(xiàn)階段前端框架的問題,必須由完全接管,這幾乎就是,或者支持語(yǔ)法的,可這與最初網(wǎng)頁(yè)設(shè)計(jì)思路是違背的。現(xiàn)代前端框架正在告訴我們新的三劍客虛擬虛擬。 1 引言 深入思考為何前端需要框架,以及 web components 是否可以代替前端框架? 原文地址,建議先閱讀原文,或者閱讀概述。 2 概述 現(xiàn)在前端...

    coordinate35 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<