Skip to content

Commit f9c9f6d

Browse files
committed
update
1 parent 68faed5 commit f9c9f6d

File tree

5 files changed

+643
-33
lines changed

5 files changed

+643
-33
lines changed

assets/python_object_malloc.png

33.6 KB
Loading

ch02.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Pyhton 中的整数对象
1+
# Python 中的整数对象
22

33
PyIntObject 的定义:
44

ch03.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Pyhton 中的字符串对象
1+
# Python 中的字符串对象
22

33
字符串对象是变长的不可变类型,定义代码如下:
44

ch15.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,34 @@
22

33
## GIL
44

5-
GIL(Global Interpreter Lock, 全局解释器锁),是 Python 内部多线程之间的一种互斥锁,为了保护在多线程之间共享的全局资源(例如引用计数器)。因为只有获得了 GIL 的线程才可以运行,所以 GIL 保证了同一时刻只有一个线程运行。
5+
GIL(Global Interpreter Lock, 全局解释器锁),是 Python 内部多线程之间的一种互斥锁,为了保护在多线程之间共享的全局资源(例如引用计数器)。因为只有获得了 GIL 的线程才可以运行,所以 GIL 保证了同一时刻只有一个线程运行。另外,GIL 保证指令的原子性。
66

77
由于 GIL 的存在,Python 中的多线程无法利用多核 CPU,因为同一时刻只有一个线程可以运行,只能利用单个 CPU,其余 CPU 处于闲置状态。
88

99
GIL 的锁粒度比较大,对多线程的性能损耗较大。假如移除 GIL,转而使用细粒度的锁,只在访问共享资源时进行加锁操作,这样看起来可以提高多线程的效率,但是:
1010

1111
- 由于使用的锁较多,容易导致死锁。
1212

13-
- 由于使用的锁较多,频繁加锁/解锁,对单线程来说,性能低于 GIL 版本。
13+
- 由于使用的锁较多,频繁加锁 / 解锁,对单线程来说,性能低于 GIL 版本。
1414

15-
综合来看,GIL是一种目前比较合适的多线程方案
15+
综合来看,GIL 是一种目前比较合适的多线程方案
1616

1717
## 线程调度
1818

19-
当一个线程运行了一定数量的字节码之后,Python 将该线程挂起,唤醒别的线程。字节码的数量可以通过`sys.getcheckinterval()`获取。
19+
- 当一个线程运行了一定数量的字节码之后,Python 将该线程挂起,唤醒别的线程。字节码的数量可以通过 `sys.getcheckinterval()` 获取。
2020

21+
- 当一个线程执行会阻塞的调用时,会主动释放 GIL。
2122

2223
## 线程实现
2324

24-
Python 中的线程是对操作系统的原生线程的封装,具体实现在 `threadmodule.c`
25+
Python 中的线程是对操作系统的原生线程的封装,具体实现在 `threadmodule.c`
26+
27+
## Python3 修改了 GIL 的实现
28+
29+
- 使用互斥锁和条件变量实现 GIL。
30+
31+
- 当有线程尝试获取 GIL 时,如果 GIL 已经被别的线程占有,那么便阻塞在 GIL 的条件变量上直到发生超时。如果超时后线程仍然没有获取到GIL,那么就设置一个标志通知占有GIL的线程释放GIL,接着又阻塞在GIL的条件变量直到超时。
32+
33+
当持有GIL的线程发现标志后,会释放掉 GIL。
34+
35+

0 commit comments

Comments
 (0)