Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /