当前位置:网站首页>推荐书籍 > 正文 >>

.NET并发编程实战

图书信息

作者:(美)里卡尔多·特雷尔(RiccardoTerrell)著叶伟民译

出版社:清华大学出版社

定价:128.00

ISBN:9787302549598

出版时间:2020-05-01

分类:图书,行业职业,计算机,网页制作

商品介绍

目录

第Ⅰ部分函数式编程在并发程序中所体现的优势

第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.4F#中的基准测试21

1.5为什么选择函数式编程实现并发21

1.6拥抱函数式范式24

1.7为什么选择F#和C#进行函数式并发编程25

1.8本章小结27

第2章并发函数式编程技术29

2.1使用函数组合解决复杂的问题30

2.1.1C#的函数组合30

2.1.2F#的函数组合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.3F#中的延迟支持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.3C#的不可变性76

3.3.4F#的不可变性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.2Fork/Join模式:并行Mandelbrot103

4.2.1当GC是瓶颈时:结构与类对象109

4.2.2并行循环的缺点111

4.3测量性能速度111

4.3.1Amdahl定律定义了性能改进的极限112

4.3.2Gustafson定律:进一步衡量性能改进113

4.3.3并行循环的局限性:素数之和113

4.3.4简单循环可能会出现什么问题115

4.3.5声明式并行编程模型117

4.4本章小结118

第5章PLINQ和MapReduce:数据并行,第2部分121

5.1PLINQ简介122

5.1.1PLINQ如何更具函数式123

5.1.2PLINQ和纯函数:并行字计数器123

5.1.3使用纯函数避免副作用125

5.1.4隔离和控制副作用:重构并行字计数器127

5.2并行聚合和归约数据128

5.2.1择伐(Deforesting):折叠的诸多优点之一130

5.2.2PLINQ中的fold:Aggregate函数131

5.2.3为PLINQ实现并行Reduce函数137

5.2.4F#的并行列表解析:PSeq139

5.2.5F#的并行数组140

5.3并行MapReduce模式142

5.3.1Map和Reduce函数143

5.3.2在NuGet包库中使用MapReduce144

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到Rx162

6.3.2IObservable:对偶IEnumerable163

6.3.3Action中的反应式扩展164

6.3.4Rx实时流165

6.3.5从事件到F#Observable166

6.4驯服事件流:使用Rx编程进行Twitter情绪分析167

6.5Rx发布者-订阅者176

6.5.1为强大的发布者-订阅者集线器使用Subject类型176

6.5.2与并发相关的Rx177

6.5.3实现可重用的Rx发布者-订阅者178

6.5.4使用RxPub-Sub类分析推文情绪180

6.5.5action中的观察者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.3C#void的问题196

7.4延续传递风格(CPS):函数式控制流程198

7.4.1为什么要利用CPS199

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.3CPU密集型和I/O密集型操作223

8.2异步编程不受的并行度224

8.3.NET的异步支持225

8.3.1异步编程会破坏代码结构228

8.3.2基于事件的异步编程228

8.4C#基于任务的异步编程229

8.4.1匿名异步lambda232

8.4.2Task是一个monadic容器232

8.5基于任务的异步编程:案例研究235

8.5.1异步取消240

8.5.2带有monadicBind运算符的基于任务的异步组合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异步工作流操作:AzureBlob存储并行操作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.Parallel269

9.3.6异步工作流取消支持274

9.3.7驯服并行异步操作276

9.4本章小结280

第10章用于流畅式并发编程的函数式组合器281

10.1执行流并不总是处于正常情况:错误处理282

10.2错误组合器:C#中的Retry、Otherwise和Task.Catch285

10.2.1FP中的错误处理:流控制的异常289

10.2.2在C#中使用Task>处理错误291

10.2.3F#AsyncOption类型:组合Async和Option291

10.2.4F#惯用的函数式异步错误处理292

10.2.5使用Result类型保留异常语义294

10.3在异步操作中控制异常298

10.3.1F#使用Async和Result建模错误处理302

10.3.2使用monadic运算符bind扩展F#AsyncResult类型304

10.4使用函数式组合器抽象化操作308

10.5函数式组合器概要309

10.5.1TPL内置异步组合器310

10.5.2利用Task.WhenAny组合器实现冗余和交叉311

10.5.3使用Task.WhenAll组合器进行异步for-each312

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.4F#代理:MailboxProcessor349

11.5使用F#MailboxProcessor避免数据库瓶颈352

11.5.1MailboxProcessor消息类型:可区分联合355

11.5.2MailboxProcessor双向通信356

11.5.3在C#中使用AgentSQL357

11.5.4成组协调代理来并行工作流358

11.5.5如何使用F#MailboxProcessor处理错误360

11.5.6停止MailboxProcessor代理——CancellationToken361

11.5.7使用MailboxProcessor分发工作362

11.5.8使用代理缓存操作364

11.5.9由MailboxProcessor报告结果368

11.5.10使用线程池报告来自MailboxProcessor的事件371

11.6F#MailboxProcessor:10000个代理的生命游戏371

11.7本章小结376

第12章使用TPLDataflow的并行工作流与代理编程379

12.1TPLDataflow的强大性380

12.2组合式设计:TPLDataflow块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使用TPLDataflow在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组合ReactiveExtensions(Rx)和TDF406

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秘制酱:ACD470

14.2.2不同的异步模式:将工作排队以稍后执行470

14.3选择正确的并发编程模型472

14.4实时交易:股票市场示例的高层架构475

14.5股票市场应用程序的基本要素479

14.6编写股票市场交易应用程序479

14.7本章小结501

附录A函数式编程503

附录BF#概述517

附录CF#异步工作流和.NETTask之间的互操作性535

内容简介

要充分释放你的多处理器计算机的卓越性能,这样并发应用程序会运行得更快,因为它们跨处理器内核分散工作,同时执行多个任务。.NET平台上的现代化工具和技术(包括并行LINQ、函数式编程、异步编程和任务并行库)十分强大,替代了传统的基于线程的并发解决方案。

《.NET并发编程实战》一书将教你编写代码以提供性能敏感型应用程序所需的速度。本书以C#和F#中的示例指导你完成在理论和实践上强调函数式编程的并发和并行设计。你将从并发的基础开始,掌握基本技术和设计实践,以优化在现代多处理器系统上运行的代码。

作者简介

"Riccardo Terrell是一位经验丰富的软件工程师和微软 MVP,他热衷于函数式编程。Riccardo在竞争激烈的商业环境中提供具有高商业价值的技术解决方案方面拥有超过20年的经验。 1998年,Riccardo在意大利创办了自己的软件公司,专门为客户提供定制的医疗软件。2007年,Riccardo移居美国,此后一直担任. NET高级软件开发人员和高级软件架构师,在业务环境中提供经济高效的技术解决方案。Riccardo致力于集成先进技术工具,以让组织内部沟通更高效,提高工作效率并降低运营成本。 他积极参与函数式编程社区,包括.NET会议和国际会议并广为人知。Riccardo相信多种范式混合编程是能够优选限度地发挥代码力量的一种机制。 叶伟民 广州.NET技术俱乐部主席、中国香港Azure/.NET技术俱乐部创始人兼主席、.NET社区联盟建设者,在.NET编程领域有15年工作经验。 "

主编推荐

"要充分释放你的多处理器计算机的卓越性能,这样并发应用程序会运行得更快,因为它们跨处理器内核分散工作,同时执行多个任务。.NET平台上的现代化工具和技术(包括并行 LINQ、函数式编程、异步编程和任务并行库)十分强大,替代了传统的基于线程的并发解决方案。     《.NET并发编程实战》一书将教你编写代码以提供性能敏感型应用程序所需的速度。本书以 C# 和 F# 中的示例指导你完成在理论和实践上强调函数式编程的并发和并行设计。你将从并发的基础开始,掌握基本技术和设计实践,以优化在现代多处理器系统上运行的代码。"

推荐书籍