Haskell并行与并发编程
Simon Marlow
喻昌远 译
出版时间:2014年10月
页数:259
本书在读者已经具备一定Haskell使用经验的基础上,展示了如何使用该语言提供的多种API和框架编写并行和并发程序。读者将了解到在并行编程中,如何利用多核处理器加速计算密集型程序,以及在并发编程中,如何使用线程编写多交互程序。
作者通过大量可以运行、试验以及扩展的代码示例来引领读者完成本书的阅读。本书将并行Haskell和并发Haskell分成单独的两部分讲解,书中还包括一些练习,用于帮助熟悉以下概念。

· 在Haskell中通过Eval monad和求值策略表达并行性
· 通过Par monad并行化普通的Haskell代码
· 使用Repa库构建基于数组的并行计算
· 使用Accelerate库直接在GPU上运行计算
· 使用一些基本的接口编写并发代码
· 为更大、更复杂的程序构建线程树
· 学习如何构建高速并发网络服务程序
· 编写在网络中的多台机器上运行的分布式程序

Simon Marlow是Facebook的软件工程师,Haskell社区的领军人物。他主持了Haskell 2010委员会并担任Haskell语言2010报告的编辑。Simon还是广泛使用的Glasgow Haskell编译器(GHC)的主要开发者之一。
  1. 第1章 绪论 
  2. 1.1 术语:并行性和并发性 
  3. 1.2 工具和资源 
  4. 1.3 示例代码 
  5. 第一部分 并行Haskell
  6. 第2章 并行基础:Eval Monad 
  7. 2.1 惰性求值和弱首范式 
  8. 2.2 Eval monad、rpar和rseq
  9. 2.3 示例:并行化数独解算器
  10. 2.4 Deepseq
  11. 第3章 求值策略
  12. 3.1 参数化策略
  13. 3.2 列表并行求值策略
  14. 3.3 示例:K均值问题
  15. 3.3.1 并行化K均值问题求解
  16. 3.3.2 性能和分析
  17. 3.3.3 spark活动可视化
  18. 3.3.4 粒度
  19. 3.4 spark垃圾回收与投机并行
  20. 3.5 使用parBuffer并行化惰性流
  21. 3.6 分块策略
  22. 3.7 恒等性
  23. 第4章 数据流并行:Par Monad 
  24. 4.1 示例:图中的最短路径
  25. 4.2 流水线并行
  26. 4.2.1 生产者限速
  27. 4.2.2 流水线并行的局限性
  28. 4.3 示例:会议时间表
  29. 4.4 示例:并行类型推断器
  30. 4.5 使用不同的调度器
  31. 4.6 Par monad和策略的对比
  32. 第5章 Repa数据并行编程
  33. 5.1 数组、形状和索引
  34. 5.2 数组运算
  35. 5.3 示例:计算最短路径
  36. 5.4 折叠和形状多态
  37. 5.5 示例:图像旋转
  38. 5.6 小结
  39. 第6章 Acellerate GPU编程
  40. 6.1 概述
  41. 6.2 数组和索引
  42. 6.3 运行简单Accelerate计算
  43. 6.4 标量数组
  44. 6.5 数组索引
  45. 6.6 在Acc中创建数组
  46. 6.7 数组配对
  47. 6.8 常数
  48. 6.9 示例:最短路径
  49. 6.9.1 在GPU上运行
  50. 6.9.2 调试CUDA后端
  51. 6.10 示例:Mandelbrot集生成器
  52. 第二部分 并发Haskell
  53. 第7章 并发基础:线程和MVar 
  54. 7.1 简单的示例:提醒器
  55. 7.2 通信:MVar 
  56. 7.3 MVar用作简单通道:日志服务
  57. 7.4 MVar用作共享状态的容器
  58. 7.5 MVar用作构件单元:无界通道
  59. 7.6 公正性
  60. 第8章 重叠I/O 
  61. 8.1 Haskell中的异常
  62. 8.2 Async的错误处理
  63. 8.3 合并
  64. 第9章 线程的取消和超时
  65. 9.1 异步异常
  66. 9.2 异步异常的屏蔽
  67. 9.3 bracket操作
  68. 9.4 通道的异步异常安全
  69. 9.5 超时
  70. 9.6 异步异常的捕获
  71. 9.7 mask和forkIO 
  72. 9.8 关于异步异常的讨论
  73. 第10章 软件事务内存
  74. 10.1 运行示例:窗口管理
  75. 10.2 阻塞
  76. 10.3 阻塞直到发生变化
  77. 10.4 STM的合并
  78. 10.5 Async的重实现
  79. 10.6 通道的STM实现
  80. 10.6.1 更多可能的操作
  81. 10.6.2 阻塞操作的复合
  82. 10.6.3 异步异常安全
  83. 10.7 通道的另一种实现
  84. 10.8 有界通道
  85. 10.9 STM的适用性
  86. 10.10 性能
  87. 10.11 小结
  88. 第11章 高级并发抽象
  89. 11.1 线程泄漏的避免
  90. 11.2 对称并发组合子
  91. 11.3 添加函子实例
  92. 11.4 小结:Async API 
  93. 第12章 并发网络服务程序
  94. 12.1 简易服务器
  95. 12.2 包含状态的简易服务器
  96. 12.2.1 设计一:单一全局锁
  97. 12.2.2 设计二:每条服务线程一个通道 
  98. 12.2.3 设计三:使用广播通道
  99. 12.2.4 设计四:使用STM 
  100. 12.2.5 实现
  101. 12.3 聊天服务器
  102. 12.3.1 架构
  103. 12.3.2 客户数据
  104. 12.3.3 服务器数据
  105. 12.3.4 服务器
  106. 12.3.5 设置新客户
  107. 12.3.6 运行客户处理
  108. 12.3.7 小结
  109. 第13章 使用线程并行编程
  110. 13.1 如何通过并发实现并行
  111. 13.2 示例:文件搜索
  112. 13.2.1 串行版本
  113. 13.2.2 并行版本
  114. 13.2.3 性能和伸缩性
  115. 13.2.4 使用信号量限制线程数量
  116. 13.2.5 ParIO monad 
  117. 第14章 分布式编程
  118. 14.1 distributed-process及相关软件包 
  119. 14.2 分布式是并发还是并行?
  120. 14.3 第一个示例:ping 
  121. 14.3.1 进程和Process Monad 
  122. 14.3.2 定义消息类型
  123. 14.3.3 Ping服务进程
  124. 14.3.4 主进程
  125. 14.3.5 main函数
  126. 14.3.6 Ping示例小结
  127. 14.4 多节点ping 
  128. 14.4.1 单机运行多节点
  129. 14.4.2 多机运行
  130. 14.5 有类型通道
  131. 14.6 故障处理
  132. 14.7 分布式聊天服务器
  133. 14.7.1 数据类型
  134. 14.7.2 发送消息
  135. 14.7.3 广播
  136. 14.7.4 分布式处理
  137. 14.7.5 测试服务器
  138. 14.7.6 故障以及增删节点
  139. 14.8 练习:分布式键值存储
  140. 第15章 调试、性能调整以及外部函数接口 
  141. 15.1 并发程序调试
  142. 15.1.1 查看线程状态
  143. 15.1.2 记录事件日志和ThreadScope 
  144. 15.1.3 死锁检测
  145. 15.2 并发(和并行)程序的调优
  146. 15.2.1 创建线程和Mvar操作
  147. 15.2.2 共享并发数据结构
  148. 15.2.3 RTS选项的调整
  149. 15.3 并发和外部函数接口
  150. 15.3.1 线程和外部对外调用
  151. 15.3.2 异步异常和外部调用
  152. 15.3.3 线程和外部对内调用
书名:Haskell并行与并发编程
作者:Simon Marlow
译者:喻昌远 译
国内出版社:人民邮电出版社
出版时间:2014年10月
页数:259
书号:978-7-115-36718-1
原版书书名:Parallel and Concurrent Programming in Haskell
原版书出版商:O'Reilly Media
Simon Marlow
 
Simon Marlow是Facebook的软件工程师,Haskell社区的领军人物。他主持了Haskell 2010委员会并担任Haskell语言2010报告的编辑。Simon还是广泛使用的Glasgow Haskell编译器(GHC)的主要开发者之一。