Skip to content

Commit 0e2f7cc

Browse files
committed
patch
1 parent 1f57381 commit 0e2f7cc

File tree

4 files changed

+22
-22
lines changed

4 files changed

+22
-22
lines changed

第一章/发现Python并行编程的工具.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
##发现Python并行编程的工具
22

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

5-
###Python线程模块
5+
###Python的threading模块
66

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

10-
###Python多进程模块
10+
###Python的mutliprocess模块
1111

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
1313
processing#multiprocessing>找到。
1414

15-
###并行Python模块
15+
###Python的parallel模块
1616

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

1919
* 最优配置的自动检测
2020
* 运行时可以改变多个工作进程
@@ -24,7 +24,7 @@ processing#multiprocessing>找到。
2424

2525
###Celery-分布式任务队列
2626

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

2929
Celery模块可以在官方的项目页面<http://celeryproject.org>得到。
3030

第一章/在并行编程通信.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55

66
###理解共享状态
77

8-
在workers中最有名的一种通信方式就是共享状态。分享状态似乎是一个简单的使用,但是这会有许多的陷阱,因为进程中的一个进程执行了无效的操作来分享资源会影响其它的进程,从而导致一个不好的结果。这也是使在多台计算机之间进行分布式的程序成为不可能的显而易见的原因。
8+
在workers中最有名的一种通信方式就是共享状态。分享状态似乎是一个简单的使用,但是这会有许多的陷阱,因为若其中某个进程对共享的资源执行了一项无效的操作会影响到所有其它的进程,从而导致一个不好的结果。这也是使在多台计算机之间进行分布式的程序成为不可能的显而易见的原因。
99

10-
为了说明这一点,我们将使用一个真实的案例。假设你是一个具体的银行的一个客户,而这个银行只用一个收银员。当你去银行,你必须要排队等到轮到你的时候。当你在队列中时,你注意到收银员一次只能为一个顾客服务,而收银员不可能同时为两个顾客提供服务而不出错。电脑运算提供数据访问控制的方式,还有一些技术,比如mutex(互斥?)。
10+
为了说明这一点,我们将使用一个真实的案例。假设你是一个具体的银行的一个客户,而这个银行只用一个收银员。当你去银行,你必须要排队等到轮到你的时候。当你在队列中时,你注意到收银员一次只能为一个顾客服务,而收银员不可能同时为两个顾客提供服务而不出错。电脑运算拥有多种手段来以可控的方式访问数据,如mutex(互斥?)。
1111

12-
Mutex可以理解为一种特殊的过程变量,表示了访问数据的可靠性等级。也就是说,在真实世界的栗子中,顾客有一个数字,在特殊的时刻,这个数字将会被激活,然后收银员对于这个顾客来说将是唯一可用的。在进程结束时,顾客将会被释放,然后收银员开始为下一个顾客服务,以此类推。
12+
Mutex可以理解为一种特殊的过程变量,表示了访问数据的可靠性等级。也就是说,在真实世界的栗子中,顾客有一个编号,在某一特定的时刻,这个编号将会被激活,然后收银员仅对于这个顾客提供服务。在进程结束时,该名顾客将会释放收银员让其为下一个顾客服务,以此类推。
1313

1414
> 在某些情况下,当程序正在运行时,在一个变量中数据会有一个常数值,数据仅仅以只读的目的被分享。所以访问控制不是必须的,因为永远不会出现完整性问题。
1515
1616
###理解信息传递
1717

18-
运用消息传递是为了避免来自共享状态带来的数据访问控制以及同步的问题。消息传递包含一种在运行的进程中进行消息交换的机制。每当我们用分布式架构开发程序的时候,就能见到消息传递的使用,在网络中,消息交换被放在一个重要的位置。语言中譬如说Erlang,在它的并行体系结构中,就是使用这个模型来实现通信。一旦在每个数据交换中出现数据复制,就并发访问来说出现问题是不可能的。尽管内存使用看起来比共享内存状态要高,但是这个模型还是有一些优势的。优势如下:
18+
运用消息传递是为了避免来自共享状态带来的数据访问控制以及同步的问题。消息传递包含一种在运行的进程中进行消息交换的机制。每当我们用分布式架构开发程序的时候,就能见到消息传递的使用,在网络中,消息交换被放在一个重要的位置。Erlang等语言,在它的并行体系结构中,就是使用这个模型来实现通信。由于每次数据交换都复制一份数据的拷贝,因此不会出现并发访问的问题。尽管内存使用看起来比共享内存状态要高,但是这个模型还是有一些优势的。优势如下:
1919

2020
* 缺乏数据的一致性访问
21-
* 数据可在本地交换(不同的进程)或者在分布式环境中
22-
* 这使得可扩展性问题以及不同系统间的互用性的可能性不太可能发生
23-
* 一般来说,据程序员来说易于维护。
21+
* 数据即可在本地交换(不同的进程)也能在分布式环境中交换
22+
* 不太可能出现扩展性问题,并且允许不同系统相互写作
23+
* 一般来说,据程序员来说易于维护。

第一章/小心Python GIL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
##小心Python GIL
22

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的演变过程中带来的好处要多于坏处。显然,我们不能仅仅将效率作为评判一个事情是好是坏的唯一的标准。
44

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>.
66

第一章/识别并行编程的问题.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
##识别并行编程的问题
22

3-
当在并行魔鬼居住的大地上战斗之时,勇敢的键盘战士将会遇到一些经典的问题。当没有经验的程序员使用workers和共享状态相结合时,许多这样的问题会经常发生。这些问题将会在下面的小节中进行描述。
3+
当在并行魔鬼居住的大地上战斗之时,勇敢的键盘战士将会遇到一些经典的问题。当没有经验的程序员使用workers和共享状态相结合时,这些问题时有发生。这些问题将会在下面的小节中进行描述。
44

55
###死锁
66

@@ -10,13 +10,13 @@
1010
1111
###饥饿
1212

13-
这个问题是由于一个或者多个进程不公平的竞争所引起的副作用,这会花费更多的时间来执行任务。想象有一组进程,A进程正在执行繁重的任务,而且这个任务还有数据处理优先级。现在,想象一下,高优先级的进程A持续不断的占用CPU,而低优先级的进程B将永远没有机会。因此可以说进程B是CPU周期中的饥饿
13+
这个问题是由于一个或者多个进程不公平的竞争所引起的副作用,这会花费更多的时间来执行任务。想象有一组进程,A进程正在执行繁重的任务,而且这个任务还有数据处理优先级。现在,想象一下,高优先级的进程A持续不断的占用CPU,而低优先级的进程B将永远没有机会。因此可以说进程B在CPU周期中是饥饿的
1414

15-
> 饥饿是由于进程排名的严重的政策调整引起的
15+
> 饥饿是由于进程排名中差劲的调整策略引起的
1616
1717
###竞态条件
1818

19-
当一个进程的结果取决于执行结果的顺序,并且这个顺序由于缺乏同步机制而被破坏,这个时候我们将面临竞态条件。在大的系统中,它们造成的问题将会难以过滤。举个栗子,有一对夫妇有一个联名的账户,在他们操作之前初始的平衡是$100.下表显示了常规的有保护机制、预期的事实顺序以及结果情况:
19+
当一个进程的结果取决于执行结果的顺序,而这个顺序由于缺乏同步机制而被破坏,这个时候我们将面临竞态条件。在大的系统中,它们造成的问题将会难以过滤。举个栗子,有一对夫妇有一个联名的账户,在他们操作之前初始的余额是$100.下表显示了常规的有保护机制、预期的事实顺序以及结果情况:
2020

2121
![](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)
2222

@@ -30,4 +30,4 @@
3030
3131

3232

33-
33+

0 commit comments

Comments
 (0)