描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787519850203
本书涵盖了Python中构建有效并发应用的前沿技术。本书介绍了并行编程体系结构,提供了基于线程和基于进程的并行性的基本技巧。你会学习利用threading和multiprocessing模块了解互斥锁、信号量、锁以及队列,所有这些都是构建并行应用的基本工具。MPI编程技巧会帮助你使用mpi4py的基本消息传递技术实现进程同步。另外,你会了解异步编程以及如何使用PyCUDA和PyOpenCL框架发挥GPU的强大功能。*后,你会了解如何用Celery设计分布式计算系统以及如何用PythonAnywhere、Docker和无服务器应用在云上部署Python应用。
读完这本书,你将能够自信地用Python构建并发高性能应用。
- 同步多个线程和进程来管理并行任务。
- 使用消息传递技术建立进程间通信来构建并行应用。
- 为自己的GPU卡编程来解决复杂的问题。
- 管理计算实体来执行分布式计算任务。
- 采用事件驱动编程模型编写高效的程序。
- 使用Django和Google App Engine研究云技术。
- 应用能改善性能的并行编程技术。
目录
前言
第1章 并行计算和Python入门 1
1.1 为什么需要并行计算? 1
1.2 费林分类法 2
1.2.1 单指令流单数据流 (SISD) 2
1.2.2 多指令流单数据流 (MISD) 3
1.2.3 单指令流多数据流 (SIMD) 4
1.2.4 多指令流多数据流 (MIMD) 4
1.3 内存组织 5
1.3.1 共享内存 6
1.3.2 分布式内存 7
1.3.3 大规模并行处理 (MPP) 8
1.3.4 工作站集群 8
1.3.5 异构体系结构 9
1.4 并行编程模型 9
1.4.1 共享内存模型 10
1.4.2 多线程模型 10
1.4.3 消息传递模型 10
1.4.4 数据并行模型 11
1.5 并行程序性能评价 13
1.5.1 加速比 14
1.5.2 效率 14
1.5.3 扩缩性 15
1.5.4 阿姆达尔定律 15
1.5.5 古斯塔夫森定律 15
1.6 Python介绍 16
1.6.1 帮助函数 16
1.6.2 语法 18
1.6.3 注释 19
1.6.4 赋值 19
1.6.5 数据类型 19
1.6.6 字符串 21
1.6.7 流控制 21
1.6.8 函数 23
1.6.9 类 24
1.6.10 异常 25
1.6.11 导入库 26
1.6.12 管理文件 26
1.6.13 列表推导 27
1.6.14 运行Python脚本 28
1.6.15 使用pip安装Python包 28
1.7 Python并行编程介绍 29
第2章 基于线程的并行 33
2.1 什么是线程? 34
2.2 Pythonthreading模块 35
2.3 定义一个线程 35
2.3.1 准备工作 35
2.3.2 实现过程 36
2.3.3 工作原理 36
2.3.4 相关内容 37
2.4 确定当前线程 37
2.4.1 准备工作 37
2.4.2 实现过程 37
2.4.3 工作原理 38
2.5 定义一个线程子类 39
2.5.1 准备工作 39
2.5.2 实现过程 39
2.5.3 工作原理 41
2.5.4 相关内容 42
2.6 使用锁的线程同步 42
2.6.1 准备工作 43
2.6.2 实现过程 43
2.6.3 工作原理 45
2.6.4 相关内容 46
2.7 使用RLock的线程同步 47
2.7.1 准备工作 47
2.7.2 实现过程 48
2.7.3 工作原理 49
2.7.4 相关内容 50
2.8 使用信号量的线程同步 51
2.8.1 准备工作 51
2.8.2 实现过程 51
2.8.3 工作原理 53
2.8.4 相关内容 54
2.9 使用条件的线程同步 54
2.9.1 准备工作 54
2.9.2 实现过程 54
2.9.3 工作原理 56
2.9.4 相关内容 58
2.10 使用事件的线程同步 58
2.10.1 准备工作 59
2.10.2 实现过程 59
2.10.3 工作原理 61
2.11 使用屏障的线程同步 62
2.11.1 准备工作 62
2.11.2 实现过程 62
2.11.3 工作原理 63
2.12 使用队列的线程通信 63
2.12.1 准备工作 64
2.12.2 实现过程 64
2.12.3 工作原理 65
2.12.4 相关内容 66
第3章 基于进程的并行 68
3.1 理解Python的multiprocessing模块 68
3.2 创建进程 69
3.2.1 准备工作 69
3.2.2 实现过程 69
3.2.3 工作原理 70
3.2.4 相关内容 71
3.2.5 参考资料 71
3.3 命名进程 72
3.3.1 准备工作 72
3.3.2 实现过程 72
3.3.3 工作原理 73
3.3.4 相关内容 73
3.3.5 参考资料 73
3.4 在后台运行进程 73
3.4.1 准备工作 74
3.4.2 实现过程 74
3.4.3 工作原理 75
3.4.4 参考资料 76
3.5 杀死进程 76
3.5.1 准备工作 76
3.5.2 实现过程 76
3.5.3 工作原理 77
3.5.4 参考资料 78
3.6 子类中定义进程 78
3.6.1 准备工作 78
3.6.2 实现过程 78
3.6.3 工作原理 79
3.6.4 相关内容 80
3.6.5 参考资料 80
3.7 使用队列交换数据 80
3.7.1 准备工作 80
3.7.2 实现过程 80
3.7.3 工作原理 82
3.7.4 相关内容 83
3.7.5 参考资料 84
3.8 使用管道交换对象 84
3.8.1 准备工作 84
3.8.2 实现过程 84
3.8.3 工作原理 86
3.8.4 相关内容 87
3.8.5 参考资料 87
3.9 同步进程 87
3.9.1 准备工作 87
3.9.2 实现过程 87
3.9.3 工作原理 89
3.9.4 相关内容 89
3.9.5 参考资料 89
3.10 使用进程池 90
3.10.1 准备工作 90
3.10.2 实现过程 91
3.10.3 工作原理 91
3.10.4 相关内容 92
3.10.5 参考资料 93
第4章 消息传递 94
4.1 技术需求 94
4.2 理解 MPI结构 95
4.3 使用mpi4pyPython模块 96
4.3.1 实现过程 96
4.3.2 工作原理 97
4.3.3 相关内容 98
4.3.4 参考资料 98
4.4 实现点对点通信 98
4.4.1 实现过程 99
4.4.2 工作原理 100
4.4.3 相关内容 101
4.4.4 参考资料 102
4.5 避免死锁问题 102
4.5.1 实 现过程 102
4.5.2 工作原理 103
4.5.3 相关内容 105
4.5.4 参考资料 106
4.6 使用广播的聚合通信 106
4.6.1 准备工作 107
4.6.2 实现过程 107
4.6.3 工作原理 107
4.6.4 相关内容 109
4.6.5 参考资料 109
4.7 使用scatter函数的聚合通信 109
4.7.1 实现过程 109
4.7.2 工作原理 110
4.7.3 相关内容 111
4.7.4 参考资料 112
4.8 使用gather函数的聚合通信 112
4.8.1 准备工作 112
4.8.2 实现过程 112
4.8.3 工作原理 113
4.8.4 相关内容 113
4.8.5 参考资料 114
4.9 使用Alltoall的聚合通信 114
4.9.1 实现过程 114
4.9.2 工作原理 114
4.9.3 相关内容 115
4.9.4 参考资料 116
4.10 归约操作 116
4.10.1 准备工作 116
4.10.2 实现过程 116
4.10.3 工作原理 117
4.10.4 相关内容 118
4.10.5 参考资料 119
4.11 优化通信 119
4.11.1 实现过程 119
4.11.2 工作原理 121
4.11.3 相关内容 123
4.11.4 参考资料 124
第5章 异步编程 125
5.1 使用concurrent.futuresPython模块 125
5.1.1 准备工作 126
5.1.2 实现过程 126
5.1.3 工作原理 128
5.1.4 相关内容 130
5.1.5 参考资料 130
5.2 使用asyncio管理事件循环 130
5.2.1 理解事件循环 131
5.2.2 实现过程 132
5.2.3 工作原理 134
5.2.4 相关内容 135
5.2.5 参考资料 136
5.3 使用asyncio处理协程 136
5.3.1 准备工作 136
5.3.2 实现过程 137
5.3.3 工作原理 3_x005f f4139
5.3.4 相关内容 141
5.3.5 参考资料 141
5.4 使用asyncio管理任务 141
5.4.1 实现过程 142
5.4.2 工作原理 143
5.4.3 相关内容 145
5.4.4 参考资料 145
5.5 处理asyncio和future 145
5.5.1 准备工作 145
5.5.2 实现过程 146
5.5.3 工作原理 147
5.5.4 相关内容 148
5.5.5 参考资料 149
第6章 分布式Python 150
6.1 分布式计算介绍 150
6.2 分布式应用的类型 151
6.2.1 客户-服务器应用 151
6.2.2 多层应用 153
6.3 使用Pythonsocket模块 153
6.3.1 准备工作 154
6.3.2 实现过程 154
6.3.3 工作原理 156
6.3.4 相关内容 157
6.3.5 参考资料 159
6.4 使用Celery的分布式任务管理 160
6.4.1 准备工作 160
6.4.2 实现过程 161
6.4.3 工作原理 162
6.4.4 相关内容 164
6.4.5 参考资料 166
6.5 使用Pyro4实现RMI 167
6.5.1 准备工作 167
6.5.2 实现过程 167
6.5.3 工作原理 169
6.5.4 相关内容 170
6.5.5 参考资料 173
第7章 云计算 174
7.1 什么是云计算? 174
7.2 理解云计算架构 176
7.2.1 服务模型 176
7.2.2 发布模型 177
7.2.3 云计算平台 178
7.3 用PythonAnywhere开发 Web应用 179
7.3.1 准备工作 179
7.3.2 实现过程 180
7.3.3 工作原理 185
7.3.4 相关内容 186
7.3.5 参考资料 187
7.4 Docker化Python应用 187
7.4.1 准备工作 188
7.4.2 实现过程 189
7.4.3 工作原理 190
7.4.4 相关内容
7.4.5 参考资料 192
7.5 无服务器计算介绍 192
7.5.1 准备工作 193
7.5.2 实现过程 193
7.5.3 工作原理 196
7.5.4 相关内容 199
7.5.5 参考资料 200
第8章 异构计算 201
8.1 理解异构计算 201
8.2 理解GPU架构 202
8.3 理解GPU编程 203
8.3.1 CUDA 203
8.3.2 OpenCL 203
8.4 处理PyCUDA 204
8.4.1 准备工作 204
8.4.2 实现过程 204
8.4.3 工作原理 205
8.4.4 相关内容 205
8.4.5 参考资料 206
8.5 使用PyCUDA的异构编程 206
8.5.1 实现过程 207
8.5.2 工作原理 209
8.5.3 相关内容 211
8.5.4 参考资料 211
8.6 使用实现内存管理 211
8.6.1 准备工作 212
8.6.2 实现过程
8.6.3 工作原理 215
8.6.4 相关内容 218
8.6.5 参考资料 218
8.7 PyOpenCL介绍 219
8.7.1 准备工作 219
8.7.2 实现过程 219
8.7.3 工作原理 221
8.7.4 相关内容 222
8.7.5 参考资料 223
8.8 使用PyOpenCL构建应用 223
8.8.1 实现过程 223
8.8.2 工作原理 226
8.8.3 相关内容 228
8.8.4 参考资料 228
8.9 使用PyOpenCL处理元素级表达式 229
8.9.1 准备工作 229
8.9.2 实现过程 229
8.9.3 工作原理 230
8.9.4 相关内容 232
8.9.5 参考资料 233
8.10 评价PyOpenCL应用 233
8.10.1 准备工作 233
8.10.2 实现过程 233
8.10.3 工作原理 235
8.10.4 相关内容 237
8.10.5 参考资料 238
8.11 使用Numba的GPU编程 238
8.11.1 准备工作 239
8.11.2 实现过程 241
8.11.3 工作原理 242
8.11.4 相关内容 243
8.11.5 参考资料 245
第9章 Python调试和测试 246
9.1 什么是调试? 246
9.2 什么是软件测试? 247
9.3 使用 WinpdbReborn调试 248
9.3.1 准备工作 248
9.3.2 实现过程 248
9.3.3 工作原理 252
9.3.4 相关内容 254
9.3.5 参考资料 255
9.4 与pdb交互 255
9.4.1 准备工作 255
9.4.2 实现过程 257
9.4.3 工作原理 258
9.4.4 相关内容 258
9.4.5 参考资料 259
9.5 实现rpdb调试 259
9.5.1 准备工作 259
9.5.2 实现过程 261
9.5.3 工作原理 263
9.5.4 相关内容 264
9.5.5 参考资料 265
9.6 处理unittest 265
9.6.1 准备工作 266
9.6.2 实现过程 266
9.6.3 工作原理 267
9.6.4 相关内容 269
9.6.5 参考资料 270
9.7 使用nose测试应用 270
9.7.1 准备工作 270
9.7.2 实现过程 271
9.7.3 工作原理 272
9.7.4 相关内容 272
9.7.5 参考资料 273
前言
计算行业的特点就是寻求不断增长的高性能,从网络、电信、航天电子等领域的高端应用,到台式计算机、笔记本电脑中的低功耗嵌入式系统和视频游戏,都是如此。这样的发展方式带来了多核系统,而在多核系统中,2核、4核和8核处理器还只是一个开端,接下来会继续发展,计算内核数还将不断增长。
不过,这种发展也带来了挑战,不只是在半导体行业中,并行应用的开发(也就是可以利用并行计算完成的应用)也遇到了挑战。
实际上,并行计算(Parallelcomputing)是指同时使用多个计算资源来解决一个处理问题,从而能够在多个CPU上执行,这就将一个问题分解为可以同时处理的多个部分,每一个部分又进一步划分为一系列指令,这些指令可以在不同的CPU上串行执行。
计算资源可能包括一个多处理器计算机、通过网络连接的任意多台计算机,或者这两种方式的组合。以往总是认为并行计算是计算的极致或未来,直到几年前,很多不同领域复杂系统和场景的数字仿真大大促进了并行计算的发展,这包括天气和气候预报、化学和核反应、人类基因组图谱、地震和地质活动、机械设备(从机械手到航天飞机)的行为、电子电路以及制造过程。
如今更多商业应用越来越多地要求开发速度更快的计算机来以复杂的方式处理大量数据。这些应用包括数据挖掘和并行数据库、石油勘探、网络搜索引擎、服务网络化业务、计算机辅助医疗诊断、跨国公司管理、高级图形和虚拟现实(特别是视频游戏行业)、多媒体和视频网络技术以及协同工作环境。
最后,并行计算代表了时间资源最大化的一种尝试,尽管时间是无限的,但时间资源却越来越珍贵和稀有。正是因为这个原因,并行计算不再仅限于非常昂贵的超级计算机(只有少数人有条件使用这些超级计算机),而转向更经济的解决方案,这些方案基于多处理器、图形处理单元(GraphicsProcessingUnit,GPU)或一些互连的计算机,可以克服串行计算的局限性和单CPU的限制。
为了介绍并行计算的概念,我们采用了最流行的编程语言之一,Python。Python之所以流行,部分原因在于它的灵活性,这是Web和桌面开发人员、系统管理员和代码开发人员以及近来数据科学家和机器学习工程师都经常使用的一个语言。
从技术角度讲,Python没有从源代码生成可执行文件的单独的编译阶段(例如,C就需要单独的编译)。事实上,Python是伪解释语言,这使它成为一个可移植的语言。一旦编写了源代码,就可以在当前使用的大多数平台上解释和执行,而不论是Apple (macOSX)还是PC(MicrosoftWindows和GNU/Linux)。
Python另一个强大之处在于它易于学习。任何人只需要几天就能使用Python编写他们的第一个应用。在这方面,这个语言的开放结构起到了根本性作用,没有冗余的声明,与我们平常讲的人类语言极为类似。最后一点,Python是自由软件:不仅Python解释器免费,在应用中使用Python也是免费的,还可以自由修改Python,并根据完全开源许可的规则重新发布。
本书包含丰富的示例,使读者可以解决实际问题。书中分析了面向并行体系结构的软件设计原则,强调程序简洁性的重要性,并避免使用复杂的术语,而是通过简明、直接的示例来说明。
每个主题都作为一个完整可用的Python程序的一部分来介绍,并在后面给出当前程序的输出。各个章节采用模块化方式组织,这为我们提供了一条成熟的道路,可以指引我们从最简单的内容逐步向最高级的主题前进,不过,如果你只想了解某些特定的问题,这本书也同样适用。
本书面向对象
本书面向想要使用并行编程技术编写强大高效的代码的软件开发人员。通过阅读这本书,你不仅能掌握并行计算的基础部分,还将掌握并行计算的高级方面。
Python编程语言很易于使用,即使是非专业的初学者,也能很容易地处理和理解这本书中介绍的内容。
本书内容
第1章,并行计算和Python入门,提供了并行编程体系结构和编程模型的一个概述。这一章会介绍Python编程语言,讨论这个语言的诸多特性,包括易学易用性和可扩展性,并提供了丰富的软件库和应用,所有这些使得Python成为一个开发应用的重要工具,对并行计算尤其是。
第2章,基于线程的并行,讨论使用threadingPython模块的线程并行性。通过大量编程示例,读者将学习如何同步和管理线程来实现多线程应用。
第3章,基于进程的并行,指导读者通过基于进程的方法并行化一个程序。通过一组完备的示例,将为读者展示如何使用multiprocessingPython模块。
第4章,消息传递,这一章重点介绍消息传递通信系统。具体将介绍mpi4py库,并提供大量应用示例。
第5章,异步编程,这一章会解释并发编程的异步模型。在某些方面,这比多线程编程简单,因为只有一个指令流,而且任务显式地放弃控制而不是被任意挂起。这一章会告诉读者如何使用asyncyio模块将各个任务组织为一个较小步骤的序列,这些步骤以一种异步方式执行。
第6章,分布式Python ,这一章会为读者介绍分布式计算,这个计算过程会聚集多个计算单元,以一种透明而一致的方式协作地运行一个计算任务。具体地,这一章中提供的示例应用会描述如何使用socket和Celery模块来管理分布式任务。
第7章,云计算,这一章概要介绍了与Python编程语言相关的主要云计算技术。Python Anywhere平台对于在云上部署Python应用非常有用,这一章将介绍这个平台。另外这一章还包含一些示例应用来展示容器和无服务器技术的使用。
第8章,异构计算,这一章将介绍现代GPU,GPU 能为数值计算提供惊人的性能,但代价是会增加编程复杂性。事实上,面向GPU的编程模型要求开发人员手动地管理CPU和GPU之间的数据传递。这一章通过使用编程示例和用例,将告诉读者如何使用一些强大的Python模块(PyCUDA、Numba和PyOpenCL)充分利用GPU卡提供的计算能力。
第9章,Python调试和测试,这是最后一章,将介绍软件工程中的两个重要主题:调试和测试。这一章会具体介绍以下Python框架:用于调试的winpdb-reborn及用于软件测试的unittest和nose。
充分利用这本书
这本书是自包含的(self-contained),即相关术语概念在本书中都有介绍。开始阅读之前,唯一的基本要求是要对编程有热情,另外对这本书介绍的内容有好奇心。
下载示例代码文件
可以从你的www.packt.com账户下载这本书的示例代码文件。如果你在其他地方购买了这本书,可以访问www.packtpub.com/support并注册,我们将直接通过email为你提供这些文件。
可以按照以下步骤下载代码文件:
(1)登录或注册www.packtpub.com。
(2)选择Support标签页。
(3)点击CodeDownloads。
(4)在Search框中输入书名,并按照屏幕上的指令下载。
一旦下载了文件,确保使用以下最新版本的解压缩工具解开文件夹:
WinRAR/7-Zip (Windows)
Zipeg/iZip/UnRarX (Mac)
7-Zip/PeaZip (Linux)
本书的代码包还在GitHub上托管(https://github.com/PacktPublishing/Python-Parallel-Programming-Cookbook-Second-Edition)。另外,https://github.com/PacktPublishing/上提供了大量图书和视频的其他代码包。看看有什么!
下载彩色图片
我们还提供了一个PDF文件,其中包含这本书中使用的截屏图/图表的彩色图片。可以从这里下载:https://static.packt-cdn.com/downloads/9781789533736_ColorImages.pdf。
排版约定
这本书使用了以下排版约定。
正文中的代码(CodeInText):指示正文中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和推特账号。下面是一个例子:“使用terminate方法可以立即杀死一个进程”。
代码块格式如下:
importsocket
port=60000
s=socket.socket()
host=socket.gethostname()
如果我们想让你注意一个代码中的某个特定部分,相应的行或项会用粗体显示:
p=multiprocessing.Process(target=foo)
print(P’rocessbeforeexecution:’,p,p.is_alive())
p.start()
命令行输入或输出都写为以下形式:
>pythonserver.py
粗体(Bold):指示一个新术语、重要单词或者屏幕上看到的单词。例如,菜单或对话框中的单词在正文中就会以这种形式显示。下面给出一个例子:“选择SystemProperties|EnvironmentVariables|UserorSystemvariables|New”。
表示警告或重要说明。
表示提示和技巧。
小节
这本书中,你会看到一些标题经常出现(准备工作、实现过程、工作原理、相关内容和参考资料)。
为了清楚地说明如何实现一个技巧,我们会使用如下小节:
准备工作
这一节告诉你这个技巧要做什么,并描述如何建立所需的所有软件或任何必要的设置。
实现过程
这一节包含完成这个技巧所需的步骤。
工作原理
这一节通常包含上一节中所做工作的详细解释。
相关内容
这一节包含有关这个技巧的更多信息,加深你对这个技巧的理解。
参考资料
这一节会提供一些有帮助的链接,可以查看这个技巧的其他有用信息。
联系我们
非常欢迎读者的反馈。
一般反馈:电子邮件请发送至[email protected],并在消息主题中提到本书书名。
如果你对这本书的任何方面有问题,请将电子邮件发送到[email protected]。
勘误:尽管我们竭尽所能地确保内容的准确性,但还是会有错误发生。如果你发现本书中的错误,请告诉我们,我们将非常感谢。请访问www.packtpub.com/support/errata,选择这本书,点击ErrataSubmissionForm (勘误提交表)链接,并填入详细信息。
非法复制:如果你看到我们的作品在互联网上有任何形式的非法拷贝,希望能向我们提
供地址或网站名,我们将不胜感谢。请联系[email protected]并提供相应链接。
如果你有兴趣成为一名作者:如果你在某个领域很有经验,而且有兴趣写书或者希望做
些贡献,请访问authors.packtpub.com。
评论
请留言评论。阅读并使用了这本书之后,你可以在购买这本书的网站上留言评论。这样
潜在读者就能看到你公正的观点,并以此决定是否购买这本书。作为出版商,我们(Packt)能从中了解你对我们的书有什么想法,另外作者也能看到对他们作品的反馈。非常感谢!
关于Packt的更多信息,请访问packtpub.com。
评论
还没有评论。