多线程是编程中常用的方法,例如,在桌面程序中,主线程一般是UI线程,负责UI绘制与用户交互,而运算处理往往是交给背后的工作线程,这样可以有效避免交互时的卡顿感
浏览器是多进程的,每打开一个网页,都会开启一个渲染进程,渲染进程包含:
GUI渲染线程 (有且只有一个)JS引擎线程 (有且只有一个)事件触发线程定时器触发线程异步http请求线程其中,JS引擎线程就是解析JS代码的线程,由于JS引擎线程有且只有一个,所以JS代码执行是单线程的(笔者注:异步函数是使用任务队列实现的,除非调用了其他线程的函数,如定时器等,不然异步函数还是单线程执行的)
【资料图】
GUI渲染线程与JS引擎线程是互斥的,且JS引擎线程会先执行,如果JS代码卡住会导致GUI绘制卡住
有关浏览器架构与原理,可以参考:
浏览器的进程与线程--深入同步、异步问题 - 知乎 (zhihu.com)Web Worker 之全面讲解 - 知乎 (zhihu.com)Web Workers就是创建JS代码执行的线程,使得JS代码执行能以多线程的方式执行,避免JS引擎线程卡住
有关Web Workers的解释可以参考:
Web Workers API - Web API 接口参考 | MDN (mozilla.org)Web Worker 使用教程 - 阮一峰的网络日志 (ruanyifeng.com)本文描述浏览器中的Web Workers并基于Cesium源码进行举例
2. Web Workers通常而言,Web Workers包含:
专用线程(Dedicated Workers)共享线程(Shared Workers)后台线程(Service Workers)等这里主要是记述通常使用的专用线程(Dedicated Workers)
Web Worker的大致的使用方法如下:
(在主线程里)创建一个Web Worker:
const worker = new Worker("WebWorkerTest.js")WebWorkerTest.js是Web Worker执行的JS代码文件加载Web Worker执行的JS代码文件需要使用HTTP或HTTPS协议,即,需要搭建网络服务器(在主线程里)向创建的Web Worker发送数据:
worker.postMessage([2, 3])(在子线程Web Worker,即WebWorkerTest.js中)接收主线程的数据、处理并发送给主线程:
onmessage = function(e) {    console.log("Message received from main script")    const workerResult = e.data[0] * e.data[1]    console.log("Posting message back to main script")    postMessage(workerResult)}(在主线程里)接收Web Worker发送的数据:
worker.onmessage = (e) => {      console.log("Result:", e.data)    }综上,此处创建了两个文件:WebWorkerTest.js和WebWorkerTest.html
WebWorkerTest.html代码如下:
  <script>    const worker = new Worker("WebWorkerTest.js")    worker.postMessage([2, 3])    worker.onmessage = (e) => {      console.log("Result:", e.data)    }  </script>WebWorkerTest.js代码如下:
onmessage = function(e) {    console.log("Message received from main script")    const workerResult = e.data[0] * e.data[1]    console.log("Posting message back to main script")    postMessage(workerResult)}运行结果如下(使用VS Code和Live Server插件):
更详细的Web Worker的使用方法,可以参考以下文档:
Web Workers API - Web API 接口参考 | MDN (mozilla.org)Web Worker 使用教程 - 阮一峰的网络日志 (ruanyifeng.com)3. Cesium中的Web WorkersCesium源码中,对Web Workers进行了封装,封装为TaskProcessor
源码中给出的TaskProcessor使用示例为:
const taskProcessor = new Cesium.TaskProcessor("myWorkerPath");const promise = taskProcessor.scheduleTask({    someParameter : true,    another : "hello"});if (!Cesium.defined(promise)) {    // too many active tasks - try again later} else {    promise.then(function(result) {        // use the result of the task    });}查看源码,可以知道taskProcessor.scheduleTask()函数为:
TaskProcessor.prototype.scheduleTask = function (parameters, transferableObjects) {  // ...  this._worker = createWorker(this);  return Promise.resolve(canTransferArrayBuffer()).then(function (    canTransferArrayBuffer  ) {    processor._worker.postMessage(      {        id: id,        parameters: parameters,        canTransferArrayBuffer: canTransferArrayBuffer,      },      transferableObjects    );    return deferred.promise;  });};createWorker()函数为
function createWorker(processor) {  const worker = new Worker(getBootstrapperUrl());  worker.postMessage = defaultValue(    worker.webkitPostMessage,    worker.postMessage  );  // ...  return worker;}不难看出,Cesium中将Web Workers封装成了Promise,既有操作Promise的优雅,又有调用Web Workers带来的多线程优势
例如,在Scene\Primitive.js中,使用TaskProcessor创建Geometry:
先是使用createGeometry.js的文件名创建TaskProcessor:
if (!defined(createGeometryTaskProcessors)) {    createGeometryTaskProcessors = new Array(numberOfCreationWorkers);    for (i = 0; i < numberOfCreationWorkers; i++) {        createGeometryTaskProcessors[i] = new TaskProcessor("createGeometry");    }}然后创建promise数组:
promises.push(    createGeometryTaskProcessors[i].scheduleTask(        {            subTasks: subTasks[i],        },        subTaskTransferableObjects    ));最后使用Promise.all方法执行所有任务并等待结果返回:
Promise.all(promises)    .then(function (results) {    primitive._createGeometryResults = results;    primitive._state = PrimitiveState.CREATED;})    .catch(function (error) {    setReady(primitive, frameState, PrimitiveState.FAILED, error);});4. 参考资料[1] Web Workers API - Web API 接口参考 | MDN (mozilla.org)
[2] Web Worker 使用教程 - 阮一峰的网络日志 (ruanyifeng.com)
[3] Cesium原理篇:4Web Workers剖析 - fu*k - 博客园 (cnblogs.com)
[4] 浏览器的进程与线程--深入同步、异步问题 - 知乎 (zhihu.com)
[5] Web Worker 之全面讲解 - 知乎 (zhihu.com)
[6] 使用 Service Worker - Web API 接口参考 | MDN (mozilla.org)
标签:
                                    本文描述浏览器中的WebWorkers并基于Cesium源码进行举例
                                    新华社北京4月25日电2020年黑人男子乔治·弗洛伊德遭美国警察“跪颈...
                                    4月24日晚间,国内光伏逆变器头部企业锦浪科技发布2022年年度报告。...
                                    1、阝是一个汉字偏旁,称 "双耳旁 "、 "双二刀 "。2、在左为 "...
                                    改装案例|雷克萨斯NX(图片|配置|询价)300H升级前轮六活塞后轮加大...
                                    最近一段时间,各地方文旅局长花式“内卷”的话题已不新鲜。为振兴...
                                    【中银证券:氟化工行业拐点在即制冷剂景气度有望持续提升】中银证...
                                    1、霹雳布袋戏虚拟人物。2、天下第一人蛰伏于魔界的一股势力,藏身...
                                    近期天气持续干燥,火险等级较高,森林防火形势严峻。为全面做好森...
                                    今后,火星大地有了中国标识。国家航天局和中国科学院还联合发布了...
                                    4月24日北向资金减持322 27万股中国平安。近5个交易日中,获北向资...
                                    1、纳税调整增加额主要由两个方面组成:一是会计处理与税收的差异需...
                                    1、没有竹篱船难行,没有秤砣秤难称;没有弯弓箭难射,没有法治国难...
                                    1、对抗组织审查违反了党的政治纪律。2、 对抗组织审查,有下列...
                                    1、意思是:重启并且选择正确的启动设备或者在已选择的启动设备中插...
                                    新京报讯(记者刘欢)4月24日,腐乳生产企业朱老六发布2022年年报,...
                                    博雷利刚提巡逻台海,80名欧洲议员要驱逐我大使,胡锡进:别理会
                                    同花顺财经讯天坛生物于4月25日发布公告,公司2022年年度权益分配预...
                                    金茂源环保(06805)公布,于2023年4月24日(交易时段后),天津滨港(作...
                                    如不能正常浏览请选用IE浏览器 天津北方网讯:23日晚,庆祝人民...
                                    源飞宠物2022年报显示,公司主营收入9 54亿元,同比下降10 77%;...
                                    泰州项目招引实现“开门红”。记者从市商务局获悉,一季度,泰州新...
                                    现代亻革家人蚯蚓蝴蝶纹套染门帘,关于现代亻革家人蚯蚓蝴蝶纹套染...
                                    香港万得通讯社报道,美国一季度实际GDP年化季率初值将于本周公布,...
                                    4月24日,上海百联集团股份有限公司发布关于时尚基金注销的进展公告...
                                    2023上海车展正在如火如荼进行当中,自主硬派越野SUV是本届车展中不...
                                    中国经济网北京4月24日讯今日,半导体及元件板块整体涨幅-2 48%,...
                                    一、广东省广州市天气预报受强雷雨云团影响,预计未来2-3小时,我区...
                                    在日常的学习、工作、生活中,肯定对各类范文都很熟悉吧。范文怎么...
                                    35岁库里有多强?创7纪录2点历史第一两数据联盟封王剑指让2追4,乔丹...