本書主要討論了構(gòu)建多線程應(yīng)用的兩種方法:一種是使用消息傳遞,另一種是使用共享內(nèi)存。你將學(xué)習(xí)實(shí)現(xiàn)每種方法的API,包括根據(jù)情況進(jìn)行選擇,以及何時(shí)可以結(jié)合使用它們。你還將親自動(dòng)手實(shí)踐這些方法構(gòu)建的高級(jí)模式。
編輯推薦
你準(zhǔn)備好用JavaScript構(gòu)建多線程應(yīng)用程序了嗎?通過這本實(shí)用的書,中級(jí)JavaScript開發(fā)者將理解瀏覽器提供的Web Worker API和Node.js提供的worker線程模塊的優(yōu)點(diǎn)和缺點(diǎn)。
專家推薦
“Bryan和Thomas精湛地闡述了多線程開發(fā)的基礎(chǔ),并巧妙地說明了各種JavaScript運(yùn)行時(shí)如何實(shí)現(xiàn)并行計(jì)算!
——James Snell
Node.js技術(shù)指導(dǎo)委員會(huì)成員
“這本書正是我在深入研究工作線程時(shí)希望閱讀的書。它詳細(xì)且實(shí)用,是一本很好的參考書。特別要贊揚(yáng)其中的分析章節(jié)。”
——Matteo Collina
NearForm首席軟件架構(gòu)師
目錄
序 1
前言 3
目錄
第1 章 概述 9
1.1 什么是線程 11
1.2 并發(fā)性和并行性 13
1.3 單線程的JavaScript .15
1.4 隱藏的線程 18
1.5 C 語言中的線程:用快樂幣致富 . 20
1.5.1 僅用一個(gè)主線程 21
1.5.2 使用4 個(gè)工作線程 .24
第2 章 瀏覽器 29
2.1 專用worker .30
2.1.1 專用worker 的Hello World 30
2.1.2 專用worker 的高級(jí)用法 .34
2.2 共享worker .36
2.2.1 共享worker 的Hello World 38
2.2.2 共享worker 的高級(jí)用法 .44
2.3 service worker .47
2.3.1 service worker 的Hello World 49
2.3.2 service worker 的高級(jí)概念 .55
2.4 消息傳遞的抽象 58
2.4.1 RPC 模式 .58
2.4.2 命令調(diào)度器模式 60
2.4.3 混合模式 .62
第3 章 Node.js .71
3.1 在擁有線程之前 72
3.2 worker_threads 模塊 75
3.2.1 workerData .76
3.2.2 MessagePort 77
3.3 再次看快樂幣(Happycoin)這個(gè)程序 .79
3.3.1 單線程版本 80
3.3.2 四個(gè)線程的版本 82
3.4 帶有Piscina 的worker 池 .85
3.5 一個(gè)完整的池化快樂幣的例子 90
第4 章 共享內(nèi)存 95
4.1 共享內(nèi)存簡(jiǎn)介 .96
4.1.1 瀏覽器中的共享內(nèi)存.96
4.1.2 在Node.js 中的共享內(nèi)存 . 100
4.2 SharedArrayBuffer 和TypedArrays 102
4.3 數(shù)據(jù)操作的原子方法 108
4.3.1 Atomics.add() . 109
4.3.2 Atomics.and() . 109
4.3.3 Atomics.compareExchange() 110
4.3.4 Atomics.exchange() . 110
4.3.5 Atomics.isLockFree() . 110
4.3.6 Atomics.load() 111
4.3.7 Atomics.or() 111
4.3.8 Atomics.store() 111
4.3.9 Atomics.sub() . 112
4.3.10 Atomics.xor() 112
4.4 原子性問題 112
4.5 數(shù)據(jù)序列化 116
4.5.1 布爾值 116
4.5.2 字符串 118
4.5.3 對(duì)象 . 120
第5 章 高級(jí)共享內(nèi)存 121
5.1 原子協(xié)調(diào)方法 121
5.1.1 Atomics.wait() 122
5.1.2 Atomics.notify() 124
5.1.3 Atomics.waitAsync() 124
5.2 時(shí)間和不確定性 . 125
5.2.1 不確定性的例子 125
5.2.2 檢測(cè)線程準(zhǔn)備情況 129
5.3 示例應(yīng)用:康威生命游戲 . 132
5.3.1 單線程生命游戲 133
5.3.2 多線程生命游戲 139
5.4 原子和事件 146
第6 章 多線程模式 149
6.1 線程池 . 149
6.1.1 線程池的大小 . 150
6.1.2 調(diào)度策略 152
6.1.3 應(yīng)用實(shí)例 153
6.2 互斥鎖:一個(gè)基本的鎖 161
6.3 用環(huán)形緩沖器處理數(shù)據(jù)流 . 167
6.4 演員模型. 176
6.4.1 模式差異 177
6.4.2 與JavaScript 的關(guān)聯(lián) 178
6.4.3 示例實(shí)現(xiàn) 179
第7 章 WebAssembly . 189
7.1 你的第一個(gè)WebAssembly .190
7.2 WebAssembly 中的原子操作 192
7.3 用Emscripten 將C 程序編譯成WebAssembly 194
7.4 其他WebAssembly 編譯器 196
7.5 AssemblyScript 197
7.6 AssemblyScript 中的快樂幣 199
第8 章 分析 . 205
8.1 何時(shí)不使用 205
8.1.1 低內(nèi)存限制 . 206
8.1.2 低核心數(shù) 209
8.1.3 容器與線程 . 213
8.2 何時(shí)使用. 213
8.3 注意事項(xiàng). 219
附錄 結(jié)構(gòu)化克隆算法 223