Skip to content

Commit 08eab75

Browse files
committed
💕(day13): Day13 学习笔记
1 parent 6b76ead commit 08eab75

File tree

2 files changed

+84
-4
lines changed

2 files changed

+84
-4
lines changed

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,11 @@ Python 100 天从新手到大师个人学习笔记与实践。
134134
- [x] 使用正则表达式 - re模块 \ compile函数 \ group和groups方法 \ match方法 \ search方法 \ findall和finditer方法 \ sub和subn方法 \ split方法
135135
- [ ] 应用案例 - 使用正则表达式验证输入的字符串
136136

137-
#### Day13 - [进程和线程](./Day01-15/Day13/进程和线程.md)
137+
#### Day13 - [进程和线程](./Day01-15/Day13/进程和线程.md)
138138

139-
- 进程和线程的概念 - 什么是进程 / 什么是线程 / 多线程的应用场景
140-
- 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信
141-
- 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池
139+
- [x] 进程和线程的概念 - 什么是进程 / 什么是线程 / 多线程的应用场景
140+
- [x] 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信
141+
- [x] 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池
142142

143143
#### Day14-A - [网络编程入门](./Day01-15/Day14-A/网络编程入门.md)
144144

day13/index.md

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Day13 - 进程和线程
2+
3+
## 概念
4+
5+
- 进程分配资源的基本单位
6+
- 一个进程可以包含多个线程
7+
- 线程是调度的基本单位
8+
9+
## 关于fork
10+
11+
- 用来创建进程
12+
- 调用 `fork()` 的是父进程
13+
- 创建出来的是子进程
14+
- 子进程是父进程的一个拷贝,但有自己的 PID
15+
- `fork()` 会返回两次
16+
- 父进程通过 `fork()` 返回值获取子进程 PID
17+
- 子进程中的返回值永远是 0
18+
19+
## Python 中的多进程
20+
21+
### 创建进程
22+
23+
- os 模块提供了 `fork()` 函数
24+
- multiprocessing 模块中的 `Process` 类可以用来创建子进程:启动进程 `start` 方法;等待进程执行结束:`join` 方法
25+
- 批量启动进程的进程池 `Pool`
26+
- 进程间通信队列 `Queue`
27+
- 管道 `Pipe`
28+
29+
### 进程间通信
30+
31+
- 使用 multiprocessing 模块中的 `Queue`(底层通过管道和信号量实现)
32+
33+
## Python 中的多线程
34+
35+
- threading 模块
36+
- 使用 `Tread` 类创建线程
37+
- 也可以继承 `Thread` 创建自己的线程类
38+
39+
```python
40+
from threading import Thread
41+
```
42+
43+
- Python 多线程并不能发挥 CPU 的多核特性
44+
45+
### 线程间通信
46+
47+
- 线程共享进程的内存空间
48+
- 实现
49+
- 设置全局变量用于共享
50+
- 注意“临界资源”的处理问题:加锁,只有获得缩的线程才能访问临界资源
51+
52+
```python
53+
from threading import Lock
54+
55+
lock = Lock()
56+
# 获取锁
57+
lock.acquire()
58+
# 释放锁
59+
lock.release()
60+
```
61+
62+
## 多进程还是多线程
63+
64+
- 无论是多线程还是多进程,数量过多都会导致效率下降
65+
- 操作系统切换线程和进程时需要:
66+
- 保存现场环境(CPU寄存器状态、内存页等)
67+
- 新任务的执行环境准备好(恢复上次的寄存器状态,切换内存页等)
68+
69+
## 单进程 + 异步 I/O
70+
71+
- 充分利用操作系统提供的异步 I/O 支持,可以使用单进程单线程执行多任务
72+
- 且看 Nginx
73+
- 单核 CPU 上采用单进程模型可以有效支持多任务
74+
- 在多核 CPU 上可以运行多个进程(数量与 CPU 核心数相同)
75+
- 单线程 + 异步 I/O 在 Python 中称为协程
76+
- 极高的执行效率
77+
- 子程序切换不是线程切换,而是由程序自身控制,因此没有线程切换的开销
78+
- 不需要多线程的锁机制。因为只有一个线程
79+
80+
## 案例

0 commit comments

Comments
 (0)