CPython中,使用了引用计数,如果多个线程中同时引用同一个变量,会造成引用计数的 race condition,引用计数只增加1,当第一线程结束时,会把引用计数减一,如果正好触发垃圾回收,这时第二个线程访问变量a就找不到有效的内存了。
- 设计者规避类似于内存管理这样复杂的竞争风险问题(race condition)
- CPython 大量使用 C 语言库,但是大部分C语言库都不是原生线程安全。
GIL 有一个 check_interval,每隔一段时间,会强制当前线程释放GIL;如果碰到I/O操作,也会释放GIL
GIL 的设计是为了方便 CPython 解释器层面的编写者,而不是 Python 应用层面的程序员,这意味着 当编写 多线程的 Python 程序时,仍然要确保线程安全。
绕过 GIL: - 绕过 CPython,使用 JPython等别的实现。
- 把关键性的代码,放到别的语言(一般是 C++)中实现。