Skip to content

Commit bfcc230

Browse files
author
hellowac
committed
update
1 parent 18fb2ee commit bfcc230

File tree

9 files changed

+144
-84
lines changed

9 files changed

+144
-84
lines changed

‎README.md‎

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
# Parallel-Programming-with-Python
1+
# 使用python并发编程
22

3-
Parallel Programming with Python,a book about parallel in python,We will translate it into Chinese.
3+
这是我在学习python的路上,在github上淘到的一本电子书,虽然出版时间有点久了,但知识是无价的,并且较新的技术或理念也是在原有知识基础上发展起来的。
44

5-
话说在ICT实习的时期,因感兴趣于Python,于是和两位朋友 [@tanghaodong25](https://github.com/tanghaodong25) 以及 [@gorlf](https://github.com/gorlf) 商量翻译一本Python相关的书籍,挑来选去感觉Parallel Programming with Python比较赞,于是拍板翻译之,另外感谢[@lujun9972](https://github.com/lujun9972)的加入,由于平时开发比较忙加上比较懒,耗时几个月才完成~
5+
在参考原文的基础上,完善了原仓库中部分对python编程术语的描述,以及补充了部分图表截图等等,主要如下:
66

7-
## Contributors
8-
9-
*[@尐鱼](https://github.com/Voidly)
10-
*[@tanghaodong25](https://github.com/tanghaodong25)
11-
*[@gorlf](https://github.com/gorlf)
12-
*[@lujun9972](https://github.com/lujun9972)
13-
14-
另外因水平有限,翻译中难免有所疏漏与瑕疵,欢迎指出,欢迎吐槽~若要进行转载请注明作者,毕竟翻译也是很花费时间与精力的不是,所以请尊重我们的劳动成果~
7+
1. 完善了部分章节的翻译描述。
8+
2. 补充了部分章节的截图。
9+
3. 使用python的mkdocs工具文档化了电子书,并且利用github pages 发布出来方便复习和分享。
1510

1611
## 在线阅读
1712

‎docs/chapter3/ReadMe.md‎

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
##识别一个可并行的问题
1+
#识别一个可并行的问题
22

33
前一章我们从不同角度探讨了并行方面的一些问题。现在我们将分析一些具体的问题,这些将在具体实现时自始至终会对我们有指导的作用。
44

‎docs/chapter8/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66

77
- 阻塞、非阻塞和异步操作
88
- 了解事件循环
9-
-使用异步
9+
-使用`asyncio`(异步)框架

‎docs/chapter8/使用asyncio.md‎

Lines changed: 94 additions & 35 deletions
Large diffs are not rendered by default.

‎docs/chapter8/总结.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# 小结
22

3-
在本章节,我们学习了异步、阻塞、非阻塞编程。为了了解这些行为,我们使用asyncio模块的基本机制写了一些例子
3+
在本章节,我们学习了异步、阻塞、非阻塞编程。为了了解这些行为,我们使用`asyncio`模块的基本机制写了一些例子
44

5-
`asyncio`模块是对python异步编程进行革命的一个尝试。吉多范罗苏姆在探索性选择和提取基本机制为这些选择提供清晰的API方面非常成功`yield from`语法产生是为了增强一些使用协程的程序的表现力,使程序员免去写回调函数的负担。除此之外,`asyncio`模块拥有与其它应用程序集成的能力。
5+
`asyncio`模块是对`python`异步编程进行革命的一个尝试。Guido Van Rossum 在探索性选择和提取基本机制为这些选择提供清晰的API方面非常成功`yield from`语法产生是为了增强一些使用协程的程序的表现力,使程序员免去写回调函数的负担。除此之外,`asyncio`模块拥有与其它应用程序集成的能力。
66

77
快到本书的结束了,写这本书还是很有挑战性的,希望它对你有所帮助。本书中有很多东西没有介绍,比如 `IPython`, `mpi4py`, `Greenlets`, `Eventlets`, 等等。
88

99
基于本书提供的内容,你可以自己做实验比较不同的工具。几乎在本书的每一个章节都用了两个相关例子来介绍,这也说明了Python可以在不改变核心代码的基础上灵活的替换不同的工具。
10+
11+
我们已经学习了一些全局解释器锁 (**GIL**) 和一些绕过 **GIL** 副作用的变通方法。 相信主要的 Python 实现(**CPython**)不会解决与 **GIL** 相关的问题; 只有未来才能揭示这一点。 **GIL****Python** 社区中一个困难且反复出现的话题。 另一方面,我们有 **PyPy** 实现,它带来了 **JIT** 和其他性能改进。 如今,**PyPy** 团队正在尝试将软件事务内存 (**STM**) 用于 **PyPy**,旨在移除 **GIL**

‎docs/chapter8/理解事件循环.md‎

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,52 @@
11
# 理解事件循环
22

3-
为了理解事件循环的概念,我们必须了解其内部结构
3+
为了理解事件循环的概念,我们需要理解构成其内部结构的元素
44

5-
我们将用资源描述符代表**套接口描述符****文件描述符**
5+
我们将使用术语**资源描述符**来代指**套接字描述符****文件描述符**
66

77
## 轮询函数
88

9-
轮询技术由不同的操作系统实现,旨在监视一个或多个资源描述符的状态。这种技术由系统功能实现。
10-
我们经常可以发现这些模型被称为准备就绪通知方案,这是因为轮询功能负责通知对事件感兴趣的人,并且资源描述符已经准备好进行交互;然而,感兴趣的程序可能会或不会完成所需的操作。
9+
轮询技术由不同的操作系统实现,旨在监视一个或多个**资源描述符**的状态,且轮询技术由系统功能负责实现。 **轮询函数**构成了事件循环的基础,我们经常发现这些模型被称为**准备就绪通知方案(RN - Readiness Notification)**,因为轮询功能通知对事件感兴趣的程序,同时**资源描述符**也已准备好进行交互; 然而,感兴趣的程序可能会或不会完成所需的操作。
1110

1211
例如,在 Linux 方面,我们有以下轮询函数:
1312

14-
-`select()`: POSIX实现有以下几个缺点:
15-
- 监控资源描述符的数量有限
16-
-`O(n)`时间复杂度,n代表连接的客户端数
13+
-`select()`: *POSIX* 实现存在一些缺点,如下所示:
14+
15+
- 要监视的**资源描述符**数量有限制。
16+
- 复杂度为 `O(n)`,其中 `n` 表示连接的客户端数量,这使得服务器无法同时处理多个客户端。
17+
1718
-`poll()`: `select()`的增强版,有以下特点:
18-
- 允许监控更大范围的资源描述符
19-
-`O(n)`时间复杂度
20-
- 支持更多类型的监控事件
21-
-`select()`对比,可以复用`entry`数据
22-
-`epoll()`: Linux非常强大的方法,拥有`O(1)`时间复杂度。`epoll()`方法通过[epoll_wait()][epoll_wait]{target="_blank"}提供两种监控事件。为了定义两种行为,我们假想一个场景,其中生产者往`socket`写数据,消费者等待数据。
23-
-**水平触发**:当消费者调用`epoll_wait()`,它将得到资源描述符的状态并且立即返回,表明触发或者不触发读操作。水平触发和事件的状态有关而不是事件本身。
24-
-**边缘触发**`epoll_wait()`调用只有当写事件完成之后才会返回。所以边缘触发和事件有关。
19+
20+
- 允许监视更大范围的资源描述符
21+
-`select()`一样的`O(n)`时间复杂度
22+
- 允许更多类型的监控事件
23+
-`select()`相比比,可以复用**entry**数据
24+
25+
-`epoll()`: 这是一个强大的 Linux 实现,具有恒定时间复杂度 `O(1)` 的吸引人的特性。 `epoll()` 函数提供了两种行为来通过 [epoll_wait()][epoll_wait]{target="_blank"} 调用来监视事件。 为了定义这两种行为,让我们想象这样一种场景:**生产者**在套接字(具有关联的**套接字描述符**)中写入数据,而**消费者**等待完成数据读取:
26+
-**水平触发**(Level-triggered):当消费者完成对 `epoll_wait()` 的调用时,它将立即获得该资源描述符的状态并返回给请求的事件,指示执行读取操作的可能性(在我们的例子中)。 因此,水平触发的行为与事件的状态直接相关,而不是事件本身。
27+
-**边缘触发**(Edge-triggered):只有当套接字中的写入事件结束并且数据可用时,对 `epoll_wait()` 的调用才会返回。 因此,在边缘触发的行为中,重点是事件本身已经发生,而不是执行任何事件的可能性。
2528

2629
!!! info ""
2730

2831
在其他平台上,也有可用的轮询功能,例如用于 BSD 和 Mac OS X 的 `kqueue`。
2932

3033
轮询函数对于创建具有可以并发方式管理多个操作的单个线程的应用程序很有用。 例如,[Tornado Web 服务器](http://www.tornadoweb.org/en/stable/overview.html){target="_blank"}是使用非阻塞 I/O 编写的,作为轮询功能,它分别支持 `epoll` 和 `kqueue for Linux` 和 `BSD/Mac OS X`。
3134

32-
轮询方法工作的步骤如下
35+
轮询函数工作步骤如下
3336

34-
1.创建`poller`对象
35-
2.`poller`中注册或者不注册1个或多个资源描述符
36-
3.轮询方法在`poller`对象中执行
37+
1.一个`poller`对象被创建.
38+
2.我们可以在`poller`中注册或不注册一个或多个资源描述符。
39+
3.轮询函数在创建的`poller`对象中执行
3740

3841
!!! info ""
3942

4043
`Poller`是一个提供使用轮询方法的抽象接口
4144

4245
## 使用事件循环
4346

44-
我们可以定义事件循环来简化使用轮询方法来监控事件。事件循环利用`poller`对象,使得程序员不用控制任务的添加、删除和事件的控制
47+
我们可以将事件循环定义为简化版的使用轮询函数监视事件的抽象。 在内部,事件循环使用`poller`对象,消除了程序员控制添加、删除和控制事件的任务的责任
4548

46-
事件循环使用回调方法来知道事件的发生。例如,有一个资源描述符A,当一个写事件在A中发生就会调用一个回调函数。一些实现了事件循环的应用如下
49+
事件循环,一般来说,利用回调函数来处理事件的发生; 例如,给定一个资源描述符A,当A中发生写事件时,会有一个回调函数。 下面列举一些用Python实现事件循环的应用示例
4750

4851
- Tornado web server ( <http://www.tornadoweb.org/en/stable/>{target="_blank"} )
4952
- Twisted ( <https://twistedmatrix.com/trac/>{target="_blank"} )
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
# 理解阻塞非阻塞和异步操作
22

3-
理解任务执行的不同方式对于构建一个可伸缩的解决方案非常重要。正确的运用异步、阻塞和非阻塞操作能大大改善系统的响应时间
3+
了解任务执行的不同方法对于建模和构思可扩展的解决方案极为重要。 了解何时使用**异步****阻塞****非阻塞**操作可以对系统的响应时间产生巨大的影响
44

55
## 理解阻塞操作
66

7-
可以用银行职员服务客户的例子来看阻塞操作。当轮到客户的号码时,银行职员就只为该客户服务直到服务完成。银行职员不能同时为多个客户办理业务。当只有2名银行职员但是每小时来100名顾客时,进度就会很缓慢。这个例子就描述了阻塞操作,当一个任务要等待另一个任务结束时,阻塞其对资源的访问。
7+
在阻塞操作的情况下,我们用在银行柜台接待客户的情境来举例子。 当呼叫特定客户的号码时,收银员的所有注意力都集中在这个特定的客户身上。 在满足当前特定客户的需求之前,收银员不能同时接待另一个客户。 现在,考虑到这一点,想象一家只有两名收银员的银行机构,当每小时有 100 名顾客涌入时; 然后我们就会面临一个处理流程的问题。 这个例子说明了处理的阻塞操作,当一个任务需要等待另一个任务结束时,阻塞了其对资源的访问。
8+
9+
!!! info ""
10+
11+
在处理阻塞操作时,请求者阻塞结果直到它的请求被完成。
812

913
## 理解非阻塞操作
1014

11-
非阻塞操作和异步操作很容易混淆,它们是不同的概念。用一个现实的场景来说明,比如你去银行咨询一个业务,银行职员说现在还没有结果,你稍后再来或者过几天再来。这就是非阻塞操作
15+
一般情况下很容易将非阻塞操作与异步操作混淆; 但是,它们是不同的概念,但他们却可以很好地协同工作,并且经常以这种方式使用。 让我们再用一个现实世界的情境来说明这种情况。 回到银行情境中,想象一下,在等待服务的客户中,有一个客户X需要提取一笔收益,但是暂时没有收益。 同时收银员不会拒绝对其他客户的服务,直到可以提取收益为止,而只是向客户 X 发出信号,让他在另一个时间或另一个日期再来
1216

1317
!!! info ""
1418

15-
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,之后再`retry`
19+
非阻塞操作是这样一种操作,它在出现**最小阻塞信号**时返回一个**控制代码**或**异常**,告诉请求者稍后重试
1620

1721
## 理解异步操作
1822

19-
假设有两个银行职员,每个职员有10个助理。这时,如果来了一个客户,他需要办理的业务耗时比较长,那么就请一个助理到后台单独为该客户服务。这样就不会阻塞其他客户
23+
回到银行机构的例子,设想每个出职员有10个助手来执行需要较长时间的任务;现在考虑我们的机构有两个职员,每个人有10个助手。随着客户的到来,如果客户X有一个可能无限期阻塞队列的请求,这个请求就会被派给一个助理,这个助理会在后台做这个工作,当客户X的答案准备好了,就会直接找他,这样职员就可以腾出手来处理后面客户的请求,而不必阻塞前面的客户的需求了
2024

2125
!!! info ""
2226

23-
注册一个回调函数,当条件满足时会触发该函数。
27+
异步操作通过**回调**、**协程**等机制通知请求结束。
28+
29+
**回调函数**是在特定条件发生时调用的函数。它通常用于处理异步执行的结果。

‎mkdocs.yaml‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
site_name: python并发编程-中文版
2+
repo_url: https://github.com/hellowac/parallel-programming-with-python-zh/tree/docs
3+
repo_name: hellowac/parallel-programming-with-python-zh
24

35
# 配置主题,在mkdocs.yml文件下
46
theme:
@@ -81,8 +83,7 @@ nav:
8183
- 处理和映射: chapter2/处理和映射.md
8284
- 小结: chapter2/总结.md
8385
- 第三章 设计并行算法:
84-
- chapter2/index.md
85-
- 识别一个并行化的问题: chapter3/识别一个并行化的问题.md
86+
- chapter3/index.md
8687
- 从多个输入中得到斐波那契最大的值: chapter3/从多个输入中得到斐波那契最大的值.md
8788
- 爬取网页: chapter3/爬取网页.md
8889
- 小结: chapter3/总结.md

0 commit comments

Comments
(0)