File tree Expand file tree Collapse file tree 5 files changed +643
-33
lines changed
Expand file tree Collapse file tree 5 files changed +643
-33
lines changed Original file line number Diff line number Diff line change 1- # Pyhton 中的整数对象
1+ # Python 中的整数对象
22
33PyIntObject 的定义:
44
Original file line number Diff line number Diff line change 1- # Pyhton 中的字符串对象
1+ # Python 中的字符串对象
22
33字符串对象是变长的不可变类型,定义代码如下:
44
Original file line number Diff line number Diff line change 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
99GIL 的锁粒度比较大,对多线程的性能损耗较大。假如移除 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+
You can’t perform that action at this time.
0 commit comments