Skip to content

Commit 0ac136a

Browse files
author
wangchao
committed
晚上前几章的翻译
1 parent 0953015 commit 0ac136a

18 files changed

+63
-68
lines changed

‎.gitignore‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,5 @@ dmypy.json
127127

128128
# Pyre type checker
129129
.pyre/
130+
131+
temp.py
Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
11
# 发现Python并行编程的工具
22

3-
由Guido Van Rossum创造的语言,是一种多泛型的,多用途的语言。由于它非常简单且易于维护,被世界各处广泛接受。它也被称为含有电池的语言。它有广泛的模块使其用起来更流畅。在并行编程中,Python有简化实现的内置和外部模块。本书基于Python3.X的。
3+
由 Guido Van Rossum 创建的 Python 语言是一种多范式、多用途的语言。 由于其强大的简单性和易于维护,它已在世界范围内被广泛接受。 它也被称为包含电池的语言。 模块种类繁多,使用起来更顺畅。 在并行编程中,Python 具有简化实现的内置和外部模块。 本书是基于Python3.X的。
44

55
## Python的threading模块
66

7-
Python的threading模块提供了一个抽象层次的模块_thread,这是一个低层次的模块。当开发一个基于线程的并行系统的艰巨任务时,它为程序员提供了一些函数来帮助程序员的开发。线程模块的官方文档可以在<<http://docs.python.org/3/library/>
8-
threading.html?highlight=threading#module-threadin>找到。
7+
Python的**threading**模块为模块 **_thread** 提供了一个抽象层,它是一个较低级别的模块。 它提供的功能可以帮助程序员完成基于线程开发并行系统的艰巨任务。 **threading**模块的官方文档可以在<http://docs.python.org/3/library/threading.html?highlight=threading#module-threadin>{target="_blank"}中找到。
98

109
## Python的mutliprocess模块
1110

12-
multiprocessing模块旨在为基于进程的并行的使用提供一个简单的API。这个模块与线程模块类似,它简化了基于进程的并行系统的开发,这一点与线程模块没有什么不同。在Python社区中,基于进程的方法很流行,因为它是在解决出现在Python中CPU-Bound threads和GIL的使用的问题时的一个解决方案。多进程模块的官方文档可以在<<http://docs.python.org/3/library/multiprocessing.html?highlight=multi>
13-
processing#multiprocessing>找到。
11+
**multiprocessing** 模块旨在为使用基于进程的并行性提供一个简单的 API。 该模块类似于线程模块,它简化了进程之间的交替,没有太大的困难。基于进程的方法在 Python 用户社区中非常流行,因为它是回答有关使用 CPU 绑定线程和 Python 中存在的 GIL 的问题的替代方法。 **multiprocessing**模块的官方文档可以在以下位置找到:<http://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#multiprocessing>
1412

1513
## Python的parallel模块
1614

17-
Python的parallel模块是外部模块,它提供了丰富的API,这些API利用进程的方法创建并行和分布式系统。这个模块是轻量级并且易安装的,它与其他的Python程序一起集成的。parallel模块可以在<http://parallelpython.com>找到。在那么多特性中,我们着重强调以下几点
15+
**parallel Python** 是外部模块,它提供了丰富的 API,这些API利用进程的方法创建并行和分布式系统。该模块是轻量级并且易安装的,并可与其他 Python 程序集成。 可以在 <http://parallelpython.com> 找到 **parallel Python** 模块。 在所有功能中,我们可能会强调以下内容
1816

19-
*最优配置的自动检测
20-
*运行时可以改变多个工作进程
17+
*自动检测最佳配置
18+
*在运行时可以更改许多工作进程的状态
2119
* 动态的负载均衡
2220
* 容错性
23-
*自发现计算资源
21+
*自动发现计算资源
2422

25-
## Celery-分布式任务队列
23+
## Celery分布式任务队列
2624

27-
Celery是一个用于创建分布式系统的极其优秀的模块,并且拥有很好的文档。它在并发形式上使用了至少三种不同类型的方法来执行任务multiprocessing, Eventlet,和 Gevent。这项工作将会集中精力在多进程的方法的使用上。而且,只需要通过配置就能实现进程间的互联,这被留下来作为一个研究,以便读者能够建立一个与他/她的实验的一个比较
25+
**Celery** 是一个出色的 Python 模块,用于创建分布式系统并具有出色的文档。 它在并发形式上使用了至少三种不同类型的方法来执行任务——multiprocessingEventlet和 Gevent。 然而,这项工作将集中精力于多处理方法的使用。 而且,只需要通过配置就能实现进程间的互相通信,它将作为一项课题研究,以便读者能够与他/她自己的实验进行比较
2826

29-
Celery模块可以在官方的项目页面<http://celeryproject.org>得到。
27+
Celery模块可以在官方的项目页面<http://celeryproject.org>{target="_blank"}得到。
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# 小心Python GIL
2+
3+
**GIL** 是一种用于实现标准 Python(称为 CPython)的一种机制,以避免由不同线程同时执行字节码。 Python 中 **GIL** 的存在是该语言用户之间激烈讨论的一个原因。 选择 **GIL** 是为了保护 **CPython** 解释器使用的内部内存,它没有为线程的并发访问实现同步机制。 无论如何,当我们决定使用线程时,**GIL** 会导致问题,而这些线程往往受 **CPU** 限制。 例如,**I/O** 线程不在 **GIL** 的范围之内。 也许该机制对 Python 的演变带来的好处多于对它的伤害。 显然,我们不能仅将速度视为判断某事好坏的单一论据。
4+
5+
在某些情况下,使用多进程配合**消息传递**能更好的平衡可维护性、可扩展性以及性能之间的关系。 可即便如此,在某些情况下确实需要线程,这将被 **GIL** 制服。 在这些情况下,可以做的就是用C语言编写一些代码作为扩展,并将它们嵌入到Python程序中。 因此,还有其他选择; 由开发人员分析真正的必要性。 那么,问题来了:一般来说,**GIL** 是反派吗?重要的是要记住,**PyPy** 团队正在研究 **STM** 实现,以便从 **Python** 中删除 **GIL**。 有关该项目的更多详细信息,请访问 <http://pypy.org/tmdonate.html>{target="_blank"}。

‎docs/chapter1/the_parallel_python_module.md‎

Lines changed: 0 additions & 5 deletions
This file was deleted.

‎docs/chapter2/ReadMe.md‎

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# 使用数据分解
22

3-
并行化问题的方法之一是通过数据分解。想象一下有这么一个场景,在这个场景中我们要以标量4乘以一个2x2矩阵(这个矩阵被称为矩阵A).在一个顺序执行系统中,我们将一个接一个的执行每个乘法的操作,最后生成所有指令的最终结果。根据矩阵A的大小,这个问题的顺序解决方案可能是旷日持久的。然而,当数据分解被应用的时候,我们可以想象矩阵A被分解为一个一个小的部分,这些分片数据被相关的workers以并行的方式接受并处理。下图以一个2x2矩阵乘以一个标量值的栗子说明了数据分解应用的概念
3+
并行化问题的方法之一是通过**数据分解**。想象一下有这么一个场景,在这个场景中我们要以标量4乘以一个2x2矩阵(这个矩阵被称为矩阵A).在一个顺序执行系统中,我们将一个接一个的执行每个乘法的操作,最后生成所有指令的最终结果。根据矩阵A的大小,这个问题的顺序解决方案可能是旷日持久的。然而,当数据分解被应用的时候,我们可以想象矩阵A被分解为一个一个小的部分,这些分片数据被相关的workers以并行的方式接受并处理。下图以一个2x2矩阵乘以一个标量值的例子说明了数据分解应用的概念
44

5-
![1](https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%202/Data%20decomposition%20in%20a%20matrix%20example.png?raw=true)
5+
![1](../imgs/2-02.png)
66

7-
上图中出现的矩阵相乘的问题有一定的对称性,每个必要的操作的结果是由一个单独的worker执行的,而且每个worker执行同样数量的操作来解决问题。然而,在现实世界中,worker的数量和已分解的数据数量的关系是不对称的,这将直接影响解决方案的性能。最后,每个worker所产生的结果必须整合起来以便使程序最终输出意义结果。为了进行这种整合,workers之间需要进行信息交换或是共享状态
7+
上图中出现的矩阵相乘的问题有一定的对称性,每个必要的操作的结果是由一个单独的worker执行的,而且每个worker执行同样数量的操作来解决问题。然而,在现实世界中,worker的数量和已分解的数据数量的关系是不对称的,这将直接影响解决方案的性能。最后,每个worker所产生的结果必须整合起来以便使程序最终输出意义结果。为了进行这种整合,workers之间需要进行**信息交换**或是**共享状态**
88

9-
> 数据分解的粒度选择将会影响一个解决方案的性能。
9+
!!! info ""
10+
11+
数据分解的粒度选择可能会影响解决方案的性能。

‎docs/chapter2/分治技术.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# 分治技术
22

3-
当你面对一个复杂的问题时,你想做的第一件事就是分解问题以便可以确定哪些部分可以独立的被处理。一般说来,在一个解决方案中,可并行的部分可以被不同的workers分开或者是分布式的执行。分治技术涉及到将一个完整的问题递归的分为不可再分的可被解决的小问题。排序算法,例如归并排序和快排都可以使用这种方法解决
3+
当你面对一个复杂的问题时,要做的第一件事就是分解问题,以确定可以独立处理的部分。 通常,解决方案中的可**并行化部分**是可以分割和分布式处理的部分,以便由不同的worker处理。 分而治之的技术涉及**递归**地分割****(domain),直到找到并解决完整问题的不可分割的单元。 **归并排序****快速排序**等排序算法都可以通过这种方式解决
44

5-
下图显示了在6个元素的向量中应用归并排序,可以看到使用了分治技术
5+
下图显示了**归并排序**在六个元素的向量中的应用,可以看到使用了**分而治之技术**
66

7-
![1](https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%202/Merge%20sort%20(divide%20and%20conquer).png?raw=true)
7+
![1](../imgs/2-01.png)

‎docs/chapter2/处理和映射.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ workers的数量并不足以在一个单一的步骤里解决一个特定的问
77
* 识别独立的任务
88
* 识别需要数据交换的任务
99

10-
###识别独立的任务
10+
## 识别独立的任务
1111

1212
在系统中识别独立的任务将允许我们在不同的workers之间分配任务,因为这些任务不需要持续的通信。因为不需要一个数据单元,所以任务可以在不同的workers间执行而不会影响其它任务的执行。
1313

14-
###识别需要数据交换的任务
14+
## 识别需要数据交换的任务
1515

1616
将需要相互通讯的任务组合起来放到单个worker中可以提高性能。当有大的通信负载的时候的时候这个真的可以提高性能,因为它能减少任务间信息交换的开销。
1717

18-
###平衡负载
18+
## 平衡负载
1919

20-
在并行解决方案中一个典型的问题是如何为不同的工作单元分配计算资源。我们越是将任务分配给不同的workers处理,我们将是需要越多的通信。另一方面,我们越是将任务组合起来分配給一个worker,与通信相关的开销越小。然而,我们可能会增加空转,也就是说,浪费了计算的能力。在并行编程中,浪费并不好。此外,越是将数据聚合在一个worker中,越会减少通过简单的添加更多的设备而增加计算能力的可扩展的灵活性。在一个基于通信的架构(轻微的数据聚合)中,为集群或者网格简单的增加机器从而提升处理性能甚至不需要中断正在运行的系统。
20+
在并行解决方案中一个典型的问题是如何为不同的工作单元分配计算资源。我们**越是将任务分配给不同的workers处理,我们将是需要越多的通信**。另一方面,我们越是将任务组合起来分配給一个worker,与通信相关的开销越小。然而,我们可能会**增加空转**,也就是说,**浪费了计算的能力**。在并行编程中,浪费并不好。此外,越是将数据聚合在一个worker中,越会减少通过简单的添加更多的设备而增加计算能力的可扩展的灵活性。在一个**基于通信的架构**(轻微的数据聚合)中,**为集群或者网格简单的增加机器从而提升处理性能甚至不需要中断正在运行的系统。**
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
# 用管道分解任务
22

3-
管道技术被用来组织多个任务,这些诶任务合作的方式来共同解决一个问题。管道将大型的任务分割成独立并行的小任务。管道模型可以类比成汽车工厂的装配线,只不过输入代替底盘称为加工的原始材料。原料经过不同的生产阶段,几个worker一个接一个执行不同的操作直到产生最终结束。这个模型和顺序范式的开发类似,任务一个接一个的作用于数据上,正常情况下,一个任务以上一个任务的结果为输入。那么这个模型和顺序技术的区别是什么呢?管道技术中的每个阶段都拥有自己的workers,并且这些workers是以并行的方式执行的
3+
**管道技术**用于必须以协作方式执行以解决问题而组织任务的一种技术。 **管道**(pipeline)将大型任务分解为以并行方式运行的较小的独立任务。 管道模型可以比作汽车工厂的装配线,其中底盘是输入的原材料。 随着原材料经过不同的生产阶段,几个worker依次执行不同的动作,直到过程结束,这样我们才能准备好汽车。 该模型与开发的顺序范式非常相似; 任务一个接一个地对数据执行,通常,一个任务得到一个输入,这是前一个任务的结果。 那么这个模型与顺序技术有什么区别呢? 管道技术的每个阶段都有自己的worker,并且他们以并行的方式处理问题
44

5-
计算上下文的一个栗子可能是一个批量处理图片,并将抽取出的数据存入数据库的系统。我们将有以下实际的顺序
5+
计算上下文中的一个示例可能是系统批量处理图像并将提取到数据库中的数据持久化。 我们将得到以下事实序列
66

77
* 接受输入的图像并且以对这些图片以并行的方式进行排列,这些图片将在第二阶段进行处理
88
* 解析图像,并且有用的信息将会被送到第三阶段
99
* 在第三阶段,过滤器被并行的应用在图像上
1010
* 来自第三阶段的数据结果被保存在数据库中
1111

12-
> 每个阶段的管道技术都用自己workers独立的执行。然而,它建立了数据通信机制,以便进行信息的交换。
12+
!!! info ""
13+
14+
**管道技术**的每个阶段都以独立的方式与自己的worker一起执行。 但是,它建立了数据通信机制,以便可以交换信息。
1315

1416
下图展示了管道的概念:
1517

16-
![1](https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%202/The%20pipeline%20technique.png?raw=true)
18+
![1](../imgs/2-03.png)

0 commit comments

Comments
(0)