《.NET並發編程實戰》是2020年清華大學出版社出版的圖書,作者是[美] 里卡爾多·特雷爾。
基本介紹
- 中文名:.NET並發編程實戰
- 作者:[美] 里卡爾多·特雷爾(Riccardo Terrell)
- 譯者:葉偉民
- 出版社:清華大學出版社
- 出版時間:2020年5月1日
- 定價:128 元
- ISBN:9787302549598
- 印次:1-1
內容簡介,目錄,
內容簡介
圖書內容 ● 最重要的並發抽象 ● 採用代理編程模型 ● 實現實時事件流處理 ● 執行無邊界異步操作 ● 適用於所有平台的最佳並發實踐和模式
目錄
第Ⅰ部分 函式式編程在並發程式中所體現的優勢
第1章 函式式並發基礎 3
1.1 你將從本書中學到什麼 4
1.2 讓我們從術語開始 5
1.2.1 順序編程——一次執行一個任務 6
1.2.2 並發編程——同時運行多個任務 7
1.2.3 並行編程——同時執行多個任務 8
1.2.4 多任務處理——同時在一段時間內執行多個任務 9
1.2.5 多執行緒性能調優 10
1.3 為什麼需要並發 11
1.4 並發編程的陷阱 14
1.4.1 並發的危害 14
1.4.2 共享狀態的演變 17
1.4.3 一個簡單的真實示例:並行快速排序 17
1.4.4 F#中的基準測試 21
1.5 為什麼選擇函式式編程實現並發 21
1.6 擁抱函式式範式 24
1.7 為什麼選擇F#和C#進行函式式並發編程 25
1.8 本章小結 27
第2章 並發函式式編程技術 29
2.1 使用函式組合解決複雜的問題 30
2.1.1 C#的函式組合 30
2.1.2 F#的函式組合 32
2.2 閉包簡化函式式思考 33
2.2.1 使用lambda表達式捕獲閉包中的變數 34
2.2.2 多執行緒環境中的閉包 36
2.3 用於程式加速的記憶化快取技術 38
2.4 記憶快速網路爬蟲的操作 42
2.5 延遲記憶化以獲得更好的性能 46
2.6 有效率的並行推測以攤銷昂貴計算成本 47
2.6.1 具有天然函式支持的預計算 50
2.6.2 使最佳計算獲勝 51
2.7 延遲是件好事情 52
2.7.1 對嚴格求值語言並發行為的理解 52
2.7.2 延遲快取技術和執行緒安全的單例模式 54
2.7.3 F#中的延遲支持 55
2.7.4 延遲和任務,一個強大的組合 55
2.8 本章小結 57
第3章 函式式數據結構和不可變性 59
3.1 真實世界的例子:捕獵執行緒不安全的對象 60
3.1.1 .NET不可變集合:一種安全的解決方案 63
3.1.2 .NET並發集合:更快的解決方案 67
3.1.3 代理訊息傳遞模式:更快、更好的解決方案 69
3.2 線上程之間安全地共享函式式數據結構 72
3.3 修改的不可變性 73
3.3.1 數據並行的函式式數據結構 75
3.3.2 使用不可變性的性能影響 75
3.3.3 C#的不可變性 76
3.3.4 F#的不可變性 79
3.3.5 函式式列表:連線一條鏈中的單元格 80
3.3.6 構建可持久化數據結構:不可變二叉樹 86
3.4 遞歸函式:一種自然的疊代方式 89
3.4.1 正確遞歸函式尾部:尾部調用最佳化 90
3.4.2 延續傳遞風格以最佳化遞歸函式 91
3.5 本章小結 95
第Ⅱ部分 如何處理並發程式的不同部分
第4章 處理大數據的基礎:數據並行,第1部分 99
4.1 什麼是數據並行 100
4.1.1 數據和任務並行 101
4.1.2 “尷尬並行”概念 102
4.1.3 .NET中的數據並行支持 102
4.2 Fork / Join模式:並行Mandelbrot 103
4.2.1 當GC是瓶頸時:結構與類對象 109
4.2.2 並行循環的缺點 111
4.3 測量性能速度 111
4.3.1 Amdahl定律定義了性能改進的極限 112
4.3.2 Gustafson定律:進一步衡量性能改進 113
4.3.3 並行循環的局限性:素數之和 113
4.3.4 簡單循環可能會出現什麼問題 115
4.3.5 聲明式並行編程模型 117
4.4 本章小結 118
第5章 PLINQ和MapReduce:數據並行,第2部分 121
5.1 PLINQ簡介 122
5.1.1 PLINQ如何更具函式式 123
5.1.2 PLINQ和純函式:並行字計數器 123
5.1.3 使用純函式避免副作用 125
5.1.4 隔離和控制副作用:重構並行字計數器 127
5.2 並行聚合和歸約數據 128
5.2.1 擇伐(Deforesting):摺疊的諸多優點之一 130
5.2.2 PLINQ中的fold:Aggregate函式 131
5.2.3 為PLINQ實現並行Reduce函式 137
5.2.4 F#的並行列表解析:PSeq 139
5.2.5 F#的並行數組 140
5.3 並行MapReduce模式 142
5.3.1 Map和Reduce函式 143
5.3.2 在NuGet 包庫中使用 MapReduce 144
5.4 本章小結 149
第6章 實時事件流:函式式反應式編程 151
6.1 反應式編程: 大事件處理 152
6.2 用於反應式編程的.NET工具 155
6.2.1 事件組合器——更好的解決方案 156
6.2.2 .NET與F#組合器的互操作性 157
6.3 .NET中的反應式編程:反應式擴展(Rx) 160
6.3.1 從LINQ/PLINQ到Rx 162
6.3.2 IObservable:對偶IEnumerable 163
6.3.3 Action中的反應式擴展 164
6.3.4 Rx實時流 165
6.3.5 從事件到F# Observable 166
6.4 馴服事件流:使用Rx編程進行Twitter情緒分析 167
6.5 Rx發布者-訂閱者 176
6.5.1 為強大的發布者-訂閱者集線器使用Subject類型 176
6.5.2 與並發相關的Rx 177
6.5.3 實現可重用的Rx發布者-訂閱者 178
6.5.4 使用Rx Pub-Sub類分析推文情緒 180
6.5.5 action中的觀察者 183
6.5.6 方便的F#對象表達式 184
6.6 本章小結 184
第7章 基於任務的函式式並行 187
7.1 任務並行的簡短介紹 188
7.1.1 為什麼要進行任務並行和函式式編程 189
7.1.2 .NET中的任務並行化支持 189
7.2 .NET任務並行庫 191
7.3 C# void的問題 196
7.4 延續傳遞風格(CPS):函式式控制流程 198
7.4.1 為什麼要利用CPS 199
7.4.2 等待任務完成:延續模型 200
7.5 組合任務操作的策略 205
7.5.1 使用數學模式以獲得更好的組合 207
7.5.2 任務使用準則 212
7.6 並行函式式管道模式 212
7.7 本章小結 218
第8章 最終勝出的任務異步模型 219
8.1 異步編程模型(APM) 220
8.1.1 異步編程的價值 220
8.1.2 可擴展性和異步編程 223
8.1.3 CPU密集型和I/O密集型操作 223
8.2 異步編程不受限制的並行度 224
8.3 .NET的異步支持 225
8.3.1 異步編程會破壞代碼結構 228
8.3.2 基於事件的異步編程 228
8.4 C#基於任務的異步編程 229
8.4.1 匿名異步lambda 232
8.4.2 Task是一個monadic容器 232
8.5 基於任務的異步編程:案例研究 235
8.5.1 異步取消 240
8.5.2 帶有monadic Bind運算符的基於任務的異步組合 244
8.5.3 延遲異步計算以實現組合 245
8.5.4 如果出現問題,請重試 246
8.5.5 異步操作的錯誤處理 247
8.5.6 股票市場歷史的異步並行處理 249
8.5.7 任務完成後的異步股票市場並行處理 251
8.6 本章小結 252
第9章 F#的異步函式編程 253
9.1 異步函式式方面 254
9.2 什麼是F#異步工作流 254
9.2.1 計算表達式中的延續傳遞風格 254
9.2.2 異步工作流操作:Azure Blob存儲並行操作 257
9.3 異步計算表達式 261
9.3.1 計算表達式和單子之間的區別 263
9.3.2 異步重試:生成自己的計算表達式 264
9.3.3 擴展異步工作流 266
9.3.4 映射異步操作:Async.map函子 267
9.3.5 並行化異步工作流:Async.Parallel 269
9.3.6 異步工作流取消支持 274
9.3.7 馴服並行異步操作 276
9.4 本章小結 280
第10章 用於流暢式並發編程的函式式組合器 281
10.1 執行流並不總是處於正常情況:錯誤處理 282
10.2 錯誤組合器:C#中的Retry、Otherwise和Task.Catch 285
10.2.1 FP中的錯誤處理:流控制的異常 289
10.2.2 在C#中使用Task
10.2.3 F# AsyncOption類型:組合Async和Option 291
10.2.4 F#慣用的函式式異步錯誤處理 292
10.2.5 使用Result類型保留異常語義 294
10.3 在異步操作中控制異常 298
10.3.1 F#使用Async和Result 建模錯誤處理 302
10.3.2 使用monadic運算符bind擴展F# AsyncResult類型 304
10.4 使用函式式組合器抽象化操作 308
10.5 函式式組合器概要 309
10.5.1 TPL內置異步組合器 310
10.5.2 利用Task.WhenAny組合器實現冗餘和交叉 311
10.5.3 使用Task.WhenAll組合器進行異步for-each 312
10.5.4 回顧迄今看到的數學模式 314
10.6 最終的並行組合套用函子 317
10.6.1 使用套用函子運算符擴展F#異步工作流 324
10.6.2 帶有中綴運算符的F#套用函子語義 326
10.6.3 利用套用函子實現異構並行計算 326
10.6.4 組合和執行異構並行計算 328
10.6.5 使用條件異步組合器控制流 330
10.6.6 運用異步組合器 334
10.7 本章小結 336
第11章 使用代理套用反應式編程 339
11.1 什麼是反應式編程 340
11.2 異步訊息傳遞編程模型 342
11.2.1 訊息傳遞和不可變性的關係 344
11.2.2 天然隔離 344
11.3 代理是什麼 345
11.3.1 代理的組件 346
11.3.2 代理可以做什麼 347
11.3.3 無鎖並發編程的無共享方法 347
11.3.4 基於代理的編程如何體現函式式思想 348
11.3.5 代理是面向對象的 349
11.4 F#代理:MailboxProcessor 349
11.5 使用F# MailboxProcessor避免資料庫瓶頸 352
11.5.1 MailboxProcessor訊息類型:可區分聯合 355
11.5.2 MailboxProcessor雙向通信 356
11.5.3 在C#中使用AgentSQL 357
11.5.4 成組協調代理來並行工作流 358
11.5.5 如何使用F# MailboxProcessor處理錯誤 360
11.5.6 停止MailboxProcessor代理——CancellationToken 361
11.5.7 使用MailboxProcessor分發工作 362
11.5.8 使用代理快取操作 364
11.5.9 由MailboxProcessor報告結果 368
11.5.10 使用執行緒池報告來自MailboxProcessor的事件 371
11.6 F# MailboxProcessor:10 000個代理的生命遊戲 371
11.7 本章小結 376
第12章 使用TPL Dataflow的並行工作流與代理編程 379
12.1 TPL Dataflow的強大性 380
12.2 組合式設計:TPL Dataflow塊 381
12.2.1 使用BufferBlock作為FIFO緩衝區 382
12.2.2 使用TransformBlock轉換數據 383
12.2.3 使用ActionBlock完成工作 384
12.2.4 連線數據流塊 385
12.3 使用TDF實現複雜的生產者/消費者 386
12.3.1 多生產者/單消費者模式 386
12.3.2 單生產者/多消費者模式 387
12.4 使用TPL Dataflow在C#中啟用代理模型 388
12.4.1 代理摺疊狀態和訊息:聚合 392
12.4.2 代理互動:並行單詞計數器 392
12.5 壓縮和加密大型流的並行工作流 397
12.5.1 上下文:處理大型數據流的問題 397
12.5.2 確保訊息流的順序完整性 402
12.5.3 連線、傳播和完成 403
12.5.4 構建TDF工作流的規則 405
12.5.5 組合Reactive Extensions(Rx)和TDF 406
12.6 本章小結 407
第Ⅲ部分 現代並發編程模式套用
第13章 成功的並發編程的配方和設計模式 411
13.1 循環利用對象以減少記憶體消耗 412
13.2 自定義並行Fork/Join運算符 415
13.3 並行具有依賴關係的任務:設計代碼以最佳化性能 418
13.4 用於協調並發I/O操作共享資源的閘門:一次寫入,多次讀取 423
13.5 執行緒安全的隨機數生成器 430
13.6 多態事件聚合器 432
13.7 自定義Rx調度程式來控制並行度 435
13.8 並發的反應式可擴展客戶端/伺服器 438
13.9 可復用的自定義高性能並行filter-map運算符 448
13.10 無阻塞同步訊息傳遞模型 452
13.11 使用代理編程模型協調並發作業 457
13.12 組合monadic函式 462
13.13 本章小結 465
第14章 使用並發函式式編程構建可擴展的移動應用程式 467
14.1 現實世界伺服器上的函式式編程 468
14.2 如何設計一個成功的高性能應用程式 469
14.2.1 秘制醬:ACD 470
14.2.2 不同的異步模式:將工作排隊以稍後執行 470
14.3 選擇正確的並發編程模型 472
14.4 實時交易:股票市場示例的高層架構 475
14.5 股票市場應用程式的基本要素 479
14.6 編寫股票市場交易應用程式 479
14.7 本章小結 501
附錄A 函式式編程 503
附錄B F#概述 517
附錄C F#異步工作流和.NET Task之間的互操作性 535