H5 worker理解

  1. Chrome 浏览器的线程模型是怎样的? (操作系统=国家 内存空间 围圈厂子(进程空间 Chrome多个进程)) 生产线(线程)

    • 程序: 计算机可以执行的代码, 存在于磁盘中, 一个程序有多个进程
    • 进程: 把程序调入到计算机的内存中, 准备执行, 是活动的, 等待被CPU执行 (分配内存空间, CPU处理)
    • 线程: CPU执行进程代码的基本单位--生产任务(生产线) 多个线程之间互不影响
  2. 进程和线程的关系

    • 进程是操作系统分配内存的基本单位 (武器工厂圈地造武器, 是国家允许的基本单位)
    • 线程必须处于进程内部(每一个武器厂的生产线就是一个线程, 国家不可能直接给你生产线分配内存, 而是由线程调度)
      一个进程至少有一个线程, 也可以有多个 (8G内存可以大致创建 4000个线程, 创建2000个左右就会卡死)
  3. 多个线程之间是怎么工作的?

    • 多个线程之间是并发执行的 (宏观上同时执行的, 微观上是同步的 时间片)
    • Chrome里面的线程: JS引擎线程, GUI线程, 异步HTTP请求线程, 定时器线程, 事件处理线程
  4. 输入一个URL

    • Chrome中发起http请求最多可以使用6个并发的线程
    • chrome中负责向页面中执行绘制任务的只有一个线程- GUI线程 (只有上面的绘制才能绘制下面的, 所以一个就够了, 多了碍事) UI主线程
      • 根本解决之道: 创建一个新的线程, 去执行耗时的js任务 JavaThread = new Thread
    • H5提供类似创建新线程的机制 new Worker('wkr.js') //工人线程 专门用来执行耗时操作的, 与UI主线程并发执行, 所以UI主线程不会卡主
  5. Worker的天然缺陷

    • 不允许接触任务的BOM和DOM对象 (window, document)
    • 原因: 只能有一个渲染线程, worker允许参与GUI的话, 浏览器GUI绘画会乱掉(同时渲染会出问题)
  6. worker的用途 (真实的项目中用到的地方比较少)

    • 非常耗时的且与DOM操作无关的时候, 会用到
  7. UI主线程可以给Worker传递数据 --- 发消息, Worker线程可以给UI主线程传递数据 --- 接收消息

    • UI线程发送消息/接收消息
      worker.postMessage(value)
      worker.onmessage=function(event) {console.log(event.data)}
      
    • Worker线程接收消息/发送消息
      onmessage = function(event) {
        console.log(event.data)
        postMessage('stringData')
      }
      
  8. worker线程是不能再创建子线程worker的, worker只能与GUI主线程进行通信 (比Java的thread更加单纯)
    总结:

    1. Worker本质上是一个线程, 在UI主线程之外并发执行的线程, 用来执行耗时的JS任务
    2. 缺陷: 不能操作DOM和BOM, 只能和UI主线程发消息
    3. 实际上的复杂操作由服务器完成, 服务器比浏览器快多了
  9. H5测试代码 (需要在服务器上运行, 本地运行会出错)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>worker 和 GUI 线程之间的通信</title>
</head>
<body>
  <input type="number" id="num" value="12" min="0" max="1000">
  <button id="startBtn">开始开启worker</button>
  <p id="result"></p>
  <script>
    var btn = document.getElementById('startBtn');
    btn.onclick = function() {
      var value =  document.getElementById('num').value;
      var worker = new Worker('worker_calculate.js');
      // UI线程给worker传递消息数据
      worker.postMessage(value)

      worker.onmessage = function(event) {
        var data = event.data;
        document.getElementById('result').innerHTML = data;
      }
      // UI主线程接收主线程传递的消息
    }
  </script>
  <button onclick="console.log(1111)">button1</button>
  <button onclick="console.log(222)">button2</button>
</body>
</html>
  1. worker_cakculate.js
/*Worker接收GUI主线程的发送的消息,  接收到消息后才能开始运算*/

console.log('Worker线程待命中')

// worker中 直接写onmessage方法即可
onmessage = function(event) {
  var n = event.data; // 表示传递过来的数据
  var value = parseInt(n);
  console.log('---------从GUI主线程获取到的数据: ', value)
  console.time('休眠')
  var now = new Date().getTime();
  do {
     var cur = new Date().getTime();
  } while (cur - now <= 5000)
  console.timeEnd('休眠')
  console.log('---------返回给GUI线程的数据',  value * value)
  postMessage('你传递过来数据的平方是:' + value * value)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容