登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』.NET并发编程实战

書城自編碼: 3496405
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作 者: [美] 里卡尔多·特雷尔[Riccardo,Terrell]
國際書號(ISBN): 9787302549598
出版社: 清华大学出版社
出版日期: 2020-05-01

頁數/字數: /
書度/開本: 16开 釘裝: 平装

售價:NT$ 768

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
新东方 剑桥雅思官方指南精讲 精确剖析官方指南样题
《 新东方 剑桥雅思官方指南精讲 精确剖析官方指南样题 》

售價:NT$ 381.0
欧洲文明进程·贫困与社会保障卷
《 欧洲文明进程·贫困与社会保障卷 》

售價:NT$ 924.0
理想国译丛030:资本之都:21世纪德里的美好与野蛮
《 理想国译丛030:资本之都:21世纪德里的美好与野蛮 》

售價:NT$ 571.0
新质生产力
《 新质生产力 》

售價:NT$ 381.0
沙盘游戏疗法
《 沙盘游戏疗法 》

售價:NT$ 498.0
图坦卡蒙和改变世界的陵墓
《 图坦卡蒙和改变世界的陵墓 》

售價:NT$ 447.0
儿童心理画:孩子的画会说话,孩子的画这样读
《 儿童心理画:孩子的画会说话,孩子的画这样读 》

售價:NT$ 386.0
朱雀:唐代的南方意向
《 朱雀:唐代的南方意向 》

售價:NT$ 498.0

編輯推薦:
要充分释放你的多处理器计算机的卓越性能,这样并发应用程序会运行得更快,因为它们跨处理器内核分散工作,同时执行多个任务。.NET平台上的现代化工具和技术包括并行 LINQ、函数式编程、异步编程和任务并行库十分强大,替代了传统的基于线程的并发解决方案。
《.NET并发编程实战》一书将教你编写代码以提供性能敏感型应用程序所需的速度。本书以 C# 和 F# 中的示例指导你完成在理论和实践上强调函数式编程的并发和并行设计。你将从并发的基础开始,掌握基本技术和设计实践,以优化在现代多处理器系统上运行的代码。
內容簡介:
图书内容
● *重要的并发抽象
● 采用代理编程模型
● 实现实时事件流处理
● 执行无边界异步操作
● 适用于所有平台的*并发实践和模式
關於作者:
Riccardo Terrell是一位经验丰富的软件工程师和微软 MVP,他热衷于函数式编程。Riccardo在竞争激烈的商业环境中提供具有高商业价值的技术解决方案方面拥有超过20年的经验。
1998年,Riccardo在意大利创办了自己的软件公司,专门为客户提供定制的医疗软件。2007年,Riccardo移居美国,此后一直担任. NET高级软件开发人员和高级软件架构师,在业务环境中提供经济高效的技术解决方案。Riccardo致力于集成先进技术工具,以让组织内部沟通更高效,提高工作效率并降低运营成本。
他积极参与函数式编程社区,包括.NET会议和国际会议并广为人知。Riccardo相信多种范式混合编程是能够最大限度地发挥代码力量的一种机制。

叶伟民
广州.NET技术俱乐部主席、中国香港Azure.NET技术俱乐部创始人兼主席、.NET社区联盟建设者,在.NET编程领域有15年工作经验。
目錄
目录

第Ⅰ部分 函数式编程在并发程序中所体现的优势
第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模式:并行Mandelbrot103
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#的并行列表解析:PSeq139
5.2.5 F#的并行数组140
5.3 并行MapReduce模式142
5.3.1 Map和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中的反应式编程:反应式扩展Rx160
6.3.1 从LINQPLINQ到Rx162
6.3.2 IObservable:对偶IEnumerable163
6.3.3 Action中的反应式扩展164
6.3.4 Rx实时流165
6.3.5 从事件到F# Observable166
6.4 驯服事件流:使用Rx编程进行Twitter情绪分析167
6.5 Rx发布者-订阅者176
6.5.1 为强大的发布者-订阅者集线器使用Subject类型176
6.5.2 与并发相关的Rx177
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 为什么要利用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 异步编程模型APM220
8.1.1 异步编程的价值220
8.1.2 可扩展性和异步编程223
8.1.3 CPU密集型和IO密集型操作223
8.2 异步编程不受限制的并行度224
8.3 .NET的异步支持225
8.3.1 异步编程会破坏代码结构228
8.3.2 基于事件的异步编程228
8.4 C#基于任务的异步编程229
8.4.1 匿名异步lambda232
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.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.1 FP中的错误处理:流控制的异常289
10.2.2 在C#中使用Task处理错误291
10.2.3 F# AsyncOption类型:组合Async和Option291
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-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.4 F#代理:MailboxProcessor349
11.5 使用F# MailboxProcessor避免数据库瓶颈352
11.5.1 MailboxProcessor消息类型:可区分联合355
11.5.2 MailboxProcessor双向通信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.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 ExtensionsRx和TDF406
12.6 本章小结407
第Ⅲ部分 现代并发编程模式应用
第13章 成功的并发编程的配方和设计模式411
13.1 循环利用对象以减少内存消耗412
13.2 自定义并行ForkJoin运算符415
13.3 并行具有依赖关系的任务:设计代码以优化性能418
13.4 用于协调并发IO操作共享资源的闸门:一次写入,多次读取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
附录B F#概述517
附录C F#异步工作流和.NET Task之间的互操作性535
內容試閱
前言
你可能正在阅读这本《.NET并发编程实战》,因为你希望构建速度极快的应用程序,或者想学习如何显著提高现有应用程序的性能。你关心性能,因为你致力于生成更快的程序,而且当代码中的一些更改使应用程序更快,响应更快时,你会感到兴奋。并行编程为对新开发技术充满热情的开发人员提供了无限的可能性。当需要考虑性能时,无论怎么强调在编程中使用并行的好处也不为过。但是,使用命令式和面向对象的编程风格来编写并发代码会很复杂,并引入了复杂性。因此,并发编程并没有被广泛地作为一种常见的实践所接受,这迫使程序员去寻找其他解决方案。
上大学的时候,我学习了函数式编程课程。那时,我学习的是Haskell,尽管该语言学习曲线很陡峭,难度很高,但是我很享受该课程的每一节课。因为我记得当我看到第一个例子时,对其解决方案的优雅以及简单而感到惊讶。15年后,当我开始寻找利用并发来增强我的程序的解决方案时,我又想起这些课程。这一次,我能够充分地认识到函数式编程在设计我的日常程序时的强大和有用。使用函数式编程风格存在一些益处,我将在《.NET并发编程实战》中对这些益处逐一进行讨论。
当时,我需要为医保行业构建一个软件系统,我的学术研究与专业工作在这里重合了。该项目需要开发一个应用程序去分析放射性医学图像。图像处理需要图像降噪、高斯算法、图像插值和图像滤波等几个步骤才能将颜色应用于灰度图像。该应用程序是使用Java开发的,最初能够按预期运行。但是后来该部门增加了需求,这种情况经常发生,这时问题就开始出现了。虽然软件没有任何问题或错误,但随着要分析的图像数量的增加,它变得更慢了。
当然,对这个问题提出的第一个解决方案是购买一个更强大的服务器。虽然在当时这是一个有效的解决方案,但是今天如果你购买一个新机器的目的是为了获得更快的CPU计算速度,你会感到失望的。这是因为现代CPU虽然有多个内核,但是其中单个内核的速度并不比2007年购买时的单个内核快。比购买新的服务器更好和更持久的替代方法是引入并行来利用多核硬件及其所有资源,从而最终加快图像处理。
从理论上讲,这是一项简单的任务,但是实际上并非如此。我必须学习如何使用线程和锁。遗憾的是,我在死锁方面获得了第一手经验。
这个死锁迫使我对应用程序的代码进行了大规模的修改。修改多到引入了bug,甚至与我做修改的原始目的无关。我很沮丧,这些代码是不可维护和脆弱的,整个过程很容易出现错误。我不得不在原来的问题上退一步,从不同的角度寻找解决方案。必须要有更好的办法。
我们使用的工具对我们的思维习惯产生深远的影响,因此也会影响我们的思维能力。
Edsger Dijkstra
在花了几天时间寻找解决多线程错乱失控问题的解决方案后,我找到了答案。我所研究和阅读的一切都指向函数式范式。多年前我在大学课堂上学到的准则现在成为我前进的机理。我使用函数式语言重写图像处理应用程序的核心以应用并行运行。从命令式过渡到函数式最初是一个挑战。我几乎忘记了我在大学中学到的一切,所以我并不自豪地说,在这次经历中,我所编写的代码在函数式语言中看起来是非常面向对象的,但总体来说这是个成功的决定。新程序的编译和运行具有显著的性能改进,硬件资源得到了完全利用并且毫无错误。另外,一个意想不到的惊喜是,函数式编程导致代码行的数量显著减少: 比使用面向对象语言的原始实现减少了近50%。
这次经历让我重新考虑OOP是否适合作为解决所有编程问题的答案。我意识到这种编程模型和解决问题的方法视野有限。我这次进入函数式编程的旅程就是始于对良好的并发编程模型的要求。
从此之后,我对应用于多线程和并发的函数式编程产生了浓厚的兴趣。在看到复杂问题和问题根源时,我就会想到这些问题在函数式编程中的解决方案,函数式编程是一个功能强大的工具,可以使用可用的硬件来更快地运行。我开始欣赏这门学科是如何以一种连贯的、可组合的、漂亮的方式来编写并发程序的。
我第一次产生写这本书的想法是在 2010年7月,那时微软推出F# 并将其作为Visual Studio 2010的一部分。那时我对业界的趋势就已经很清楚了,越来越多的主流编程语言支持函数式,包括 C#、C、Java和Python。2007年,C# 3.0引入了头等函数和新的构造如lambda表达式和类型推断,从而引入函数式编程概念,并且很快就出现了允许声明式编程风格的语言集成查询Language Integrate Query,LINQ。
.NET平台已经融入了函数式世界。随着F#的引入,Microsoft拥有了同时支持面向对象和函数式范式的功能齐全的语言。此外,像C#这样的面向对象语言变得越来越混合了,弥合了不同编程模式之间的差距,从而允许这两种编程风格共存。
此外,我们正面临着多核时代,在这个时代里,CPU能力是以可用内核的数量来衡量的, 而不是以每秒的时钟周期来衡量的。有了这一趋势之后,单线程应用程序将无法在多核系统上实现更高的速度,除非该应用程序集成了并行性并使用算法将工作分散到多个内核上。
现在已经很清楚了,多线程是必需的,这个观点点燃了我把这种编程方法带给你的热情。《.NET并发编程实战》结合了并发编程和函数式范式的强大功能,并使用C#和F#语言来编写可读的、更模块化的和可维护的代码。你的代码将受益于这些技术,以更少的代码在最佳性能下运行,从而提高工作效率和程序的弹性。
开始开发多线程代码是一个激动人心的时刻。在这个过程中,软件公司比以往任何时候都更需要合适的工具和技术以便在不需要做出妥协的情况下选择对应的正确编程风格。在学习并行编程的过程中,最开始的挑战将会很快地减少,而对你毅力的回报则是无限的。
无论你的专业领域是什么,无论你是后端开发人员还是前端Web开发人员,无论你是开发基于云的应用程序或视频游戏,使用并行来获得更好的性能并构建可扩展的应用程序,这点都将一直存在。
《.NET并发编程实战》将描述我运用函数式编程使用C#和F#编写.NET并发程序的经验。我相信函数式编程正在成为编写并发代码,协调.NET中的异步和并行程序的实际方式,《.NET并发编程实战》将为你提供你所需的一切知识,从而让你做好准备并投身这个令人兴奋的多核计算机编程领域。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.