File tree Expand file tree Collapse file tree 6 files changed +31
-31
lines changed Expand file tree Collapse file tree 6 files changed +31
-31
lines changed Original file line number Diff line number Diff line change 2
2
3
3
自从计算系统进化以来,它们已经开始提供一个能使我们以并行的方式运行指定软件的独立的某部分的机制,从而提升响应速度以及一般的性能。此外,我们可以很容易的验证配备有多个处理器以及多核的机器。那么,为什么不利用这个架构呢?
4
4
5
- 在系统开发的所有情况下,从智能手机、平板电脑到研究中心的重型计算,并行编程都是现实的。并行编程的一个坚实的基础将允许开发人员优化一个应用的性能。这会增强用户体验移机计算资源的消费 ,从而减少完成复杂任务的处理时间。
5
+ 在系统开发的所有情况下,从智能手机、平板电脑到研究中心的重型计算,并行编程都是现实的。并行编程的一个坚实的基础将允许开发人员优化一个应用的性能。这会增强用户体验以及计算资源的消费 ,从而减少完成复杂任务的处理时间。
6
6
7
- 举一个并行性的栗子 ,让我们想象一个场景,在这个场景中,有其他的任务,在其它任务中,有一个应用是从数据库中检索一些信息, 而这个数据库规模又很大。再考虑一下 ,这个应用还需要顺序执行,在这个应用中,这些任务必须以一定的逻辑顺序,一个接一个的执行。当用户请求数据时,在返回的数据没有结束之前,其它系统将一直被阻塞。然而,利用并行编程,我们将会创造一个新的worker来在数据库红查询信息 ,而不会阻塞这个应用的其它功能,从而提高它的使用。
7
+ 举一个并行性的例子 ,让我们想象一个场景,在这个场景中,有一些任务,其中一个任务是从数据库中检索一些信息, 而这个数据库规模又很大。再假如 ,这个应用还需要顺序执行,在这个应用中,这些任务必须以一定的逻辑顺序,一个接一个的执行。当用户请求数据时,在返回的数据没有结束之前,其它系统将一直被阻塞。然而,利用并行编程,我们将会创造一个新的worker来在数据库中查询信息 ,而不会阻塞这个应用的其它功能,从而提高它的使用。
Original file line number Diff line number Diff line change 1
1
##发现Python并行编程的工具
2
2
3
- 由Guido Van Rossum创造的语言,是一种多泛型的,多用途的语言。由于它非常简单且易于维护,被世界各处广泛接受。它也被称为含有电池的语言。它有广泛的模块使其用起来更流畅。在并行编程中,Python有简化实现的内置和外部模块。这是基于Python3 .X的。
3
+ 由Guido Van Rossum创造的语言,是一种多泛型的,多用途的语言。由于它非常简单且易于维护,被世界各处广泛接受。它也被称为含有电池的语言。它有广泛的模块使其用起来更流畅。在并行编程中,Python有简化实现的内置和外部模块。本书基于Python3 .X的。
4
4
5
- ###Python线程模块
5
+ ###Python的threading模块
6
6
7
- Python线程模块提供了一个抽象层次的模块_thread ,这是一个低层次的模块。当开发一个基于线程的并行系统的艰巨任务时,它为程序员提供了一些函数来帮助程序员的开发。线程模块的官方文档可以在<http://docs.python.org/3/library/
7
+ Python的threading模块提供了一个抽象层次的模块_thread ,这是一个低层次的模块。当开发一个基于线程的并行系统的艰巨任务时,它为程序员提供了一些函数来帮助程序员的开发。线程模块的官方文档可以在<http://docs.python.org/3/library/
8
8
threading.html?highlight=threading#module-threadin>找到。
9
9
10
- ###Python多进程模块
10
+ ###Python的mutliprocess模块
11
11
12
- 多进程模块旨在为基于进程的并行的使用提供一个简单的API 。这个模块与线程模块类似,它简化了进程间的交替而没有什么难度 。在Python社区中,基于进程的方法很流行,因为它是在回答出现在Python中CPU -Bound threads和GIL的使用的问题时的一个解决方案。多进程模块的官方文档可以在<http://docs.python.org/3/library/multiprocessing.html?highlight=multi
12
+ multiprocessing模块旨在为基于进程的并行的使用提供一个简单的API 。这个模块与线程模块类似,它简化了基于进程的并行系统的开发,这一点与线程模块没有什么不同 。在Python社区中,基于进程的方法很流行,因为它是在解决出现在Python中CPU -Bound threads和GIL的使用的问题时的一个解决方案。多进程模块的官方文档可以在<http://docs.python.org/3/library/multiprocessing.html?highlight=multi
13
13
processing#multiprocessing>找到。
14
14
15
- ###并行Python模块
15
+ ###Python的parallel模块
16
16
17
- 并行Python模块是外部提供的 ,它提供了丰富的API,这些API利用进程的方法创建并行和分布式系统。这个模块是轻量级并且易安装的,它与其他的Python程序一起集成的。并行模块可以在 < http://parallelpython.com > 找到。在那么多特性中,我们着重强调以下几点:
17
+ Python的parallel模块是外部模块 ,它提供了丰富的API,这些API利用进程的方法创建并行和分布式系统。这个模块是轻量级并且易安装的,它与其他的Python程序一起集成的。parallel模块可以在 < http://parallelpython.com > 找到。在那么多特性中,我们着重强调以下几点:
18
18
19
19
* 最优配置的自动检测
20
20
* 运行时可以改变多个工作进程
@@ -24,7 +24,7 @@ processing#multiprocessing>找到。
24
24
25
25
###Celery-分布式任务队列
26
26
27
- Celery是一个用于创建分布式系统的极其优秀的模块,并且拥有很好的文档。它在并发形式上使用了至少三种不同类型的方法来执行任务:multiprocessing, Eventlet,和 Gevent。这项工作将会集中精力在多进程的方法的使用上。而且,一个与另一个的连接就是配置问题 ,这被留下来作为一个研究,以便读者能够建立一个与他/她的实验的一个比较。
27
+ Celery是一个用于创建分布式系统的极其优秀的模块,并且拥有很好的文档。它在并发形式上使用了至少三种不同类型的方法来执行任务:multiprocessing, Eventlet,和 Gevent。这项工作将会集中精力在多进程的方法的使用上。而且,只需要通过配置就能实现进程间的互联 ,这被留下来作为一个研究,以便读者能够建立一个与他/她的实验的一个比较。
28
28
29
29
Celery模块可以在官方的项目页面< http://celeryproject.org > 得到。
30
30
Original file line number Diff line number Diff line change 5
5
6
6
###理解共享状态
7
7
8
- 在workers中最有名的一种通信方式就是共享状态。分享状态似乎是一个简单的使用,但是这会有许多的陷阱,因为进程中的一个进程执行了无效的操作来分享资源会影响其它的进程 ,从而导致一个不好的结果。这也是使在多台计算机之间进行分布式的程序成为不可能的显而易见的原因。
8
+ 在workers中最有名的一种通信方式就是共享状态。分享状态似乎是一个简单的使用,但是这会有许多的陷阱,因为若其中某个进程对共享的资源执行了一项无效的操作会影响到所有其它的进程 ,从而导致一个不好的结果。这也是使在多台计算机之间进行分布式的程序成为不可能的显而易见的原因。
9
9
10
- 为了说明这一点,我们将使用一个真实的案例。假设你是一个具体的银行的一个客户,而这个银行只用一个收银员。当你去银行,你必须要排队等到轮到你的时候。当你在队列中时,你注意到收银员一次只能为一个顾客服务,而收银员不可能同时为两个顾客提供服务而不出错。电脑运算提供数据访问控制的方式,还有一些技术,比如mutex (互斥?)。
10
+ 为了说明这一点,我们将使用一个真实的案例。假设你是一个具体的银行的一个客户,而这个银行只用一个收银员。当你去银行,你必须要排队等到轮到你的时候。当你在队列中时,你注意到收银员一次只能为一个顾客服务,而收银员不可能同时为两个顾客提供服务而不出错。电脑运算拥有多种手段来以可控的方式访问数据,如mutex (互斥?)。
11
11
12
- Mutex可以理解为一种特殊的过程变量,表示了访问数据的可靠性等级。也就是说,在真实世界的栗子中,顾客有一个数字,在特殊的时刻,这个数字将会被激活,然后收银员对于这个顾客来说将是唯一可用的 。在进程结束时,顾客将会被释放,然后收银员开始为下一个顾客服务 ,以此类推。
12
+ Mutex可以理解为一种特殊的过程变量,表示了访问数据的可靠性等级。也就是说,在真实世界的栗子中,顾客有一个编号,在某一特定的时刻,这个编号将会被激活,然后收银员仅对于这个顾客提供服务 。在进程结束时,该名顾客将会释放收银员让其为下一个顾客服务 ,以此类推。
13
13
14
14
> 在某些情况下,当程序正在运行时,在一个变量中数据会有一个常数值,数据仅仅以只读的目的被分享。所以访问控制不是必须的,因为永远不会出现完整性问题。
15
15
16
16
###理解信息传递
17
17
18
- 运用消息传递是为了避免来自共享状态带来的数据访问控制以及同步的问题。消息传递包含一种在运行的进程中进行消息交换的机制。每当我们用分布式架构开发程序的时候,就能见到消息传递的使用,在网络中,消息交换被放在一个重要的位置。语言中譬如说Erlang ,在它的并行体系结构中,就是使用这个模型来实现通信。一旦在每个数据交换中出现数据复制,就并发访问来说出现问题是不可能的 。尽管内存使用看起来比共享内存状态要高,但是这个模型还是有一些优势的。优势如下:
18
+ 运用消息传递是为了避免来自共享状态带来的数据访问控制以及同步的问题。消息传递包含一种在运行的进程中进行消息交换的机制。每当我们用分布式架构开发程序的时候,就能见到消息传递的使用,在网络中,消息交换被放在一个重要的位置。Erlang等语言 ,在它的并行体系结构中,就是使用这个模型来实现通信。由于每次数据交换都复制一份数据的拷贝,因此不会出现并发访问的问题 。尽管内存使用看起来比共享内存状态要高,但是这个模型还是有一些优势的。优势如下:
19
19
20
20
* 缺乏数据的一致性访问
21
- * 数据可在本地交换 (不同的进程)或者在分布式环境中
22
- * 这使得可扩展性问题以及不同系统间的互用性的可能性不太可能发生 。
23
- * 一般来说,据程序员来说易于维护。
21
+ * 数据即可在本地交换 (不同的进程)也能在分布式环境中交换
22
+ * 不太可能出现扩展性问题,并且允许不同系统相互写作 。
23
+ * 一般来说,据程序员来说易于维护。
Original file line number Diff line number Diff line change 1
1
##小心Python GIL
2
2
3
- GIL是一种用于实现标准Python的一种机制, 也被称为CPython,是为了避免不同的线程同时执行字节码。在这门语言的使用者中,GIL存在的原因被激烈的讨论着。GIL被选来用于保护被CPython解释器使用的内存储器,而没有实现为线程的并发访问的同步机制 。在任何情况下,当我们决定使用线程时,GIL将会导致一个问题,这些往往是CPU受限。比如说,I/O Threads超出了GIL的范围。也许机制将会对Python的演变带来更多的好处而不是坏处 。显然,我们不能仅仅将效率作为评判一个事情是好是坏的唯一的标准。
3
+ GIL是一种用于实现标准Python( 也被称为CPython)的一种机制 ,是为了避免不同的线程同时执行字节码。在这门语言的使用者中,GIL存在的原因被激烈的讨论着。GIL被用于保护被CPython解释器使用的内存储器,因为CPython解析器并未实现为线程的并发访问的同步机制 。在任何情况下,当我们决定使用线程时,GIL将会导致一个问题,这些往往是CPU受限。比如说,I/O Threads超出了GIL的范围。也许GIL机在Python的演变过程中带来的好处要多于坏处 。显然,我们不能仅仅将效率作为评判一个事情是好是坏的唯一的标准。
4
4
5
- 在某些支持进程的任务情况下使用消息传递将会在可维护性、可扩展性以及性能上带来更好的关系。即使如此,在某些情况下真的会需要线程,而这将会对GIL进行减弱。在这些情况下 ,所能做的就是写一些代码片段作为C语言的扩展,并且把它们嵌入到Python程序中。因此也是有替代品的,这应由开发人员分析真正的需求。那么问题来了,GIL一般来说是一个恶棍吗?重要的是要记住,PyPy团队正致力于将GIL从Python中移除的STM的实现。想了解有关此项目的更多细节,请访问< http://pypy.org/tmdonate.html > .
5
+ 很多情况下,使用多进程配合消息传递能更好的平衡可维护性、可扩展性以及性能之间的关系。然而,在某些情况下即使由于GIL的存在会降低效率也还是会需要线程。这时 ,所能做的就是写一些代码片段作为C语言的扩展,并且把它们嵌入到Python程序中。因此也是有替代品的,这应由开发人员分析真正的需求。那么问题来了,GIL一般来说是一个恶棍吗?重要的是要记住,PyPy团队正致力于将GIL从Python中移除的STM的实现。想了解有关此项目的更多细节,请访问< http://pypy.org/tmdonate.html > .
6
6
Original file line number Diff line number Diff line change 1
1
##探索并行化的几种模式
2
2
3
- 当我们试图定义并行系统的主要模式的时候,我们有一定的困惑。在并发并行系统中找到语录很常见,就像它们意味着同一件事。然而它们有着轻微的差异 。
3
+ 当我们试图定义并行系统的主要模式时,有困惑很正常。常常会有人提到并发系统和并行系统,这两个术语看起来像是讲的同一件事。然而实际上有着轻微的差异 。
4
4
5
- 在并发程序中,我们有这么一个场景,在这个场景中,一个程序分派几个workers,这些workers争着使用CPU来执行任务。在纷争发生的阶段将被CPU调度器所控制,CPU调度器的功能是决定在一个特殊的时刻 ,哪个worker更适合使用资源。在大多数情况下,CPU调度器执行清理过程的任务太快以至于我们会有伪并行的印象。因此,并发编程是来自并行编程的一种抽象。
5
+ 在并发程序中,我们有这么一个场景,在这个场景中,一个程序分派几个workers,这些workers争着使用CPU来执行任务。在纷争发生的阶段将被CPU调度器所控制,CPU调度器的功能是决定在一个特定的时刻 ,哪个worker更适合使用资源。在大多数情况下,CPU调度器执行清理过程的任务太快以至于我们会有伪并行的印象。因此,并发编程是来自并行编程的一种抽象。
6
6
7
- > 并发系统争夺同一个CPU来执行任务 。
7
+ > 并发系统允许多个任务争夺同一个CPU 。
8
8
9
9
下图显示了一个并发程序方案:
10
10
11
11
![ ] ( https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%201/Concurrent%20programming%20scheme.png?raw=true )
12
12
13
- 并行编程可以被定义为一种方法,在那个方法中,程序数据创造workers在多核环境中同时的执行指定的任务,在那些任务中它们不需要并发的接触CPU 。
13
+ 并行编程可以被定义为一种方法,在那个方法中,程序数据创造workers在多核环境中同时执行指定的任务,在这些任务中它们不需要并发的接触CPU 。
14
14
15
15
> 并行系统同时的运行任务。
16
16
17
17
下面的图显示了并行系统的概念:
18
18
19
19
![ ] ( https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%201/Parallel%20programming%20scheme.png?raw=true )
20
20
21
- 分布式编程旨在在计算机器 (节点)之间通过消息交换数据来分享进程,这是物理分离。
21
+ 分布式编程旨在在物理分离的计算机器 (节点)之间通过消息交换数据来分享进程
22
22
23
23
分布式编程变得越来越受欢迎的原因有很多,下面是被探讨的受欢迎的原因:
24
24
25
- * ** 容错性** :由于系统是去中心化的,我们可以分发执行同一个网络的不同机器 ,从而执行指定机器的个人维护而不影响整个系统的功能。
25
+ * ** 容错性** :由于系统是去中心化的,我们可以分发执行到同一个网络的不同机器 ,从而执行指定机器的个人维护而不影响整个系统的功能。
26
26
* ** 横向扩展** :通常我们可以在分布式系统中增加处理的性能。我们可以在不需要终止正在执行的应用的情况下连接新的设备。
27
27
* ** 云计算** :随着硬件成本的降低,我们需要这种业务类型的增长,在这种增长中,我们可以获得巨大的机器集群,这些集群对用户来说以一种合作的方式运行并且以一种透明的方式运行程序。
28
28
29
29
> 分布式系统在物理隔离的节点上运行任务。
30
30
31
31
下图显示了一个分布式系统的方案:
32
32
33
- ![ ] ( https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%201/Distributed%20programming%20scheme.png?raw=true )
33
+ ![ ] ( https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%201/Distributed%20programming%20scheme.png?raw=true )
Original file line number Diff line number Diff line change 1
1
##识别并行编程的问题
2
2
3
- 当在并行魔鬼居住的大地上战斗之时,勇敢的键盘战士将会遇到一些经典的问题。当没有经验的程序员使用workers和共享状态相结合时,许多这样的问题会经常发生 。这些问题将会在下面的小节中进行描述。
3
+ 当在并行魔鬼居住的大地上战斗之时,勇敢的键盘战士将会遇到一些经典的问题。当没有经验的程序员使用workers和共享状态相结合时,这些问题时有发生 。这些问题将会在下面的小节中进行描述。
4
4
5
5
###死锁
6
6
10
10
11
11
###饥饿
12
12
13
- 这个问题是由于一个或者多个进程不公平的竞争所引起的副作用,这会花费更多的时间来执行任务。想象有一组进程,A进程正在执行繁重的任务,而且这个任务还有数据处理优先级。现在,想象一下,高优先级的进程A持续不断的占用CPU,而低优先级的进程B将永远没有机会。因此可以说进程B是CPU周期中的饥饿 。
13
+ 这个问题是由于一个或者多个进程不公平的竞争所引起的副作用,这会花费更多的时间来执行任务。想象有一组进程,A进程正在执行繁重的任务,而且这个任务还有数据处理优先级。现在,想象一下,高优先级的进程A持续不断的占用CPU,而低优先级的进程B将永远没有机会。因此可以说进程B在CPU周期中是饥饿的 。
14
14
15
- > 饥饿是由于进程排名的严重的政策调整引起的 。
15
+ > 饥饿是由于进程排名中差劲的调整策略引起的 。
16
16
17
17
###竞态条件
18
18
19
- 当一个进程的结果取决于执行结果的顺序,并且这个顺序由于缺乏同步机制而被破坏 ,这个时候我们将面临竞态条件。在大的系统中,它们造成的问题将会难以过滤。举个栗子,有一对夫妇有一个联名的账户,在他们操作之前初始的平衡是 $100.下表显示了常规的有保护机制、预期的事实顺序以及结果情况:
19
+ 当一个进程的结果取决于执行结果的顺序,而这个顺序由于缺乏同步机制而被破坏 ,这个时候我们将面临竞态条件。在大的系统中,它们造成的问题将会难以过滤。举个栗子,有一对夫妇有一个联名的账户,在他们操作之前初始的余额是 $100.下表显示了常规的有保护机制、预期的事实顺序以及结果情况:
20
20
21
21
![ ] ( https://github.com/Voidly/Img/blob/master/Parallel%20Programming%20with%20Python/Chapter%201/Presents%20baking%20operations%20without%20the%20chance%20of%20race%20conditions%20occurrence.png?raw=true )
22
22
30
30
31
31
32
32
33
-
33
+
You can’t perform that action at this time.
0 commit comments