File tree 2 files changed +84
-4
lines changed
2 files changed +84
-4
lines changed Original file line number Diff line number Diff line change @@ -134,11 +134,11 @@ Python 100 天从新手到大师个人学习笔记与实践。
134
134
- [x] 使用正则表达式 - re模块 \ compile函数 \ group和groups方法 \ match方法 \ search方法 \ findall和finditer方法 \ sub和subn方法 \ split方法
135
135
- [ ] 应用案例 - 使用正则表达式验证输入的字符串
136
136
137
- #### Day13 - [ 进程和线程] ( ./Day01-15/Day13/进程和线程.md )
137
+ #### ✅ Day13 - [ 进程和线程] ( ./Day01-15/Day13/进程和线程.md )
138
138
139
- - 进程和线程的概念 - 什么是进程 / 什么是线程 / 多线程的应用场景
140
- - 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信
141
- - 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池
139
+ - [x] 进程和线程的概念 - 什么是进程 / 什么是线程 / 多线程的应用场景
140
+ - [x] 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信
141
+ - [x] 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池
142
142
143
143
#### Day14-A - [ 网络编程入门] ( ./Day01-15/Day14-A/网络编程入门.md )
144
144
Original file line number Diff line number Diff line change
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
+ ## 案例
You can’t perform that action at this time.
0 commit comments