Skip to content

Commit 4e091d9

Browse files
committed
更新了部分文档
1 parent 0d01379 commit 4e091d9

16 files changed

+876
-25
lines changed

Day01-15/13.进程和线程.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -316,17 +316,17 @@ if __name__ == '__main__':
316316

317317
但是,切换作业是有代价的,比如从语文切到数学,要先收拾桌子上的语文书本、钢笔(这叫保存现场),然后,打开数学课本、找出圆规直尺(这叫准备新环境),才能开始做数学作业。操作系统在切换进程或者线程时也是一样的,它需要先保存当前执行的现场环境(CPU寄存器状态、内存页等),然后,把新任务的执行环境准备好(恢复上次的寄存器状态,切换内存页等),才能开始执行。这个切换过程虽然很快,但是也需要耗费时间。如果有几千个任务同时进行,操作系统可能就主要忙着切换任务,根本没有多少时间去执行任务了,这种情况最常见的就是硬盘狂响,点窗口无反应,系统处于假死状态。所以,多任务一旦多到一个限度,反而会使得系统性能急剧下降,最终导致所有任务都做不好。
318318

319-
是否采用多任务的第二个考虑是任务的类型,可以把任务分为计算密集型和I/O密集型。计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如对视频进行编码解码或者格式转换等等,这种任务全靠CPU的运算能力,虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低。计算密集型任务由于主要消耗CPU资源,这类任务用Python这样的脚本语言去执行效率通常很低,最能胜任这类任务的是C语言,我们之前提到了Python中有嵌入C/C++代码的机制。
319+
是否采用多任务的第二个考虑是任务的类型,可以把任务分为计算密集型和I/O密集型。计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如对视频进行编码解码或者格式转换等等,这种任务全靠CPU的运算能力,虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低。计算密集型任务由于主要消耗CPU资源,这类任务用Python这样的脚本语言去执行效率通常很低,最能胜任这类任务的是C语言,我们之前提到过Python中有嵌入C/C++代码的机制。
320320

321321
除了计算密集型任务,其他的涉及到网络、存储介质I/O的任务都可以视为I/O密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待I/O操作完成(因为I/O的速度远远低于CPU和内存的速度)。对于I/O密集型任务,如果启动多任务,就可以减少I/O等待时间从而让CPU高效率的运转。有一大类的任务都属于I/O密集型任务,这其中包括了我们很快会涉及到的网络应用和Web应用。
322322

323323
> **说明:** 上面的内容和例子来自于[廖雪峰官方网站的《Python教程》](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000),因为对作者文中的某些观点持有不同的看法,对原文的文字描述做了适当的调整。
324324
325325
### 单线程+异步I/O
326326

327-
现代操作系统对I/O操作的改进中最为重要的就是支持异步I/O。如果充分利用操作系统提供的异步I/O支持,就可以用单进程单线程模型来执行多任务,这种全新的模型称为事件驱动模型。Nginx就是支持异步I/O的Web服务器,它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上,可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。用Node.js开发的服务器端程序也使用了这种工作模式,这也是当下实现多任务编程的一种趋势
327+
现代操作系统对I/O操作的改进中最为重要的就是支持异步I/O。如果充分利用操作系统提供的异步I/O支持,就可以用单进程单线程模型来执行多任务,这种全新的模型称为事件驱动模型。Nginx就是支持异步I/O的Web服务器,它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上,可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。用Node.js开发的服务器端程序也使用了这种工作模式,这也是当下并发编程的一种流行方案
328328

329-
在Python语言中,单线程+异步I/O的编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序。协程最大的优势就是极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。协程的第二个优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不用加锁,只需要判断状态就好了,所以执行效率比多线程高很多。如果想要充分利用CPU的多核特性,最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。关于这方面的内容,我稍后会做一个专题来进行讲解
329+
在Python语言中,单线程+异步I/O的编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序。协程最大的优势就是极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。协程的第二个优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不用加锁,只需要判断状态就好了,所以执行效率比多线程高很多。如果想要充分利用CPU的多核特性,最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。关于这方面的内容,在后续的课程中会进行讲解
330330

331331
### 应用案例
332332

Day21-30/code/垃圾分类查询/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
// 查询垃圾分类的函数
103103
search() {
104104
if (this.word.trim().length > 0) {
105-
let key = '9636cec76ee2593ba6b195e5b770b394'
105+
let key = 'e8c5524dd2a365f20908ced735f8e480'
106106
let url = `http://api.tianapi.com/txapi/lajifenlei/?key=${key}&word=${this.word}`
107107
fetch(url)
108108
.then(resp => resp.json())

Day31-35/31-35.玩转Linux操作系统.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ Linux系统的命令通常都是如下所示的格式:
954954

955955
8. 创建/激活/关闭交换分区 - **mkswap** / **swapon** / **swapoff**
956956

957-
> 说明:执行上面这些命令会带有一定的风险,如果不清楚这些命令的用法,最好不用随意使用,在使用的过程中,最好对照参考资料进行操作,并在操作前确认是否要这么做。
957+
> **说明**:执行上面这些命令会带有一定的风险,如果不清楚这些命令的用法,最好不用随意使用,在使用的过程中,最好对照参考资料进行操作,并在操作前确认是否要这么做。
958958

959959
### 编辑器 - vim
960960

Day36-40/code/HRS_create_and_init.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
drop database if exists hrs;
2-
create database hrs default charset utf8mb4;
2+
create database hrs default charset utf8mb4 collate utf8_bin;
33

44
use hrs;
55

Day41-55/45.制作报表.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def export_teachers_excel(request):
4646
# 中文文件名需要处理成百分号编码
4747
filename = quote('老师.xls')
4848
# 通过响应头告知浏览器下载该文件以及对应的文件名
49-
resp['content-disposition'] = f'attachment; filename*=utf-8''{filename}'
49+
resp['content-disposition'] = f'attachment; filename*=utf-8\'\'{filename}'
5050
return resp
5151
```
5252

Day61-65/62.数据采集和解析.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ XPath是在XML文档中查找信息的一种语法,它使用路径表达式来
225225
<price>29.99</price>
226226
</book>
227227
<book>
228-
<title lang="eng">Learning XML</title>
228+
<title lang="zh">三国演义</title>
229229
<price>39.95</price>
230230
</book>
231231
</bookstore>

Day66-70/67.NumPy的应用.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ Numpy最为核心的数据类型是`ndarray`,使用`ndarray`可以处理一维
103103
产生10个$[1, 100)$范围的随机整数,代码:
104104

105105
```Python
106-
array5 = np.random.randint(1, 101, 10)
106+
array5 = np.random.randint(1, 100, 10)
107107
array5
108108
```
109109

@@ -1124,7 +1124,7 @@ print(np.power(array37, array38))
11241124
11251125
| 函数 | 说明 |
11261126
| --------------------------------- | ---- |
1127-
| `add(x, y)` / `substract(x, y)` / `multiply` | 加法函数 / 减法函数 |
1127+
| `add(x, y)` / `substract(x, y)` | 加法函数 / 减法函数 |
11281128
|`multiply(x, y)` / `divide(x, y)`|乘法函数 / 除法函数|
11291129
| `floor_divide(x, y)` / `mod(x, y)` | 整除函数 / 求模函数 |
11301130
|`allclose(x, y)`|检查数组`x``y`元素是否几乎相等|
@@ -1139,7 +1139,7 @@ print(np.power(array37, array38))
11391139
| `setdiff1d(x, y)` | 计算`x``y`的差集,返回这些元素构成的数组 |
11401140
| `setxor1d(x, y)` | 计算`x``y`的对称差,返回这些元素构成的数组 |
11411141
1142-
>**补充说明:在二维空间内,两个向量$\boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \end{bmatrix}$和$\boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \end{bmatrix}$的叉积是这样定义的:$\boldsymbol{A}\times \boldsymbol{B}=\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}=a_1b_2 - a_2b_1$,其中$\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}$称为行列式。但是一定要注意,叉积并不等同于行列式,行列式的运算结果是一个标量,而叉积运算的结果是一个向量。如果不明白,我们可以看看三维空间两个向量,$\boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix}$和$\boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix}$的叉积是$\left< \hat{i} \begin{vmatrix} a_2 \quad a_3 \\ b_2 \quad b_3 \end{vmatrix}, -\hat{j} \begin{vmatrix} a_1 \quad a_3 \\ b_1 \quad b_3 \end{vmatrix}, \hat{k} \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} \right>$,其中$\hat{i}, \hat{j}, \hat{k}$代表每个维度的单位向量。
1142+
>**补充说明**:在二维空间内,两个向量$\boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \end{bmatrix}$和$\boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \end{bmatrix}$的叉积是这样定义的:$\boldsymbol{A}\times \boldsymbol{B}=\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}=a_1b_2 - a_2b_1$,其中$\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}$称为行列式。但是一定要注意,叉积并不等同于行列式,行列式的运算结果是一个标量,而叉积运算的结果是一个向量。如果不明白,我们可以看看三维空间两个向量,$\boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix}$和$\boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix}$的叉积是$\left< \hat{i} \begin{vmatrix} a_2 \quad a_3 \\ b_2 \quad b_3 \end{vmatrix}, -\hat{j} \begin{vmatrix} a_1 \quad a_3 \\ b_1 \quad b_3 \end{vmatrix}, \hat{k} \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} \right>$,其中$\hat{i}, \hat{j}, \hat{k}$代表每个维度的单位向量。
11431143
11441144
#### 广播机制
11451145

0 commit comments

Comments
 (0)