如今的计算机都是多核多线程,允许并行运算,即使处理器单核也可以使用并发来提高运行效率。
比如在一个线程等待网络数据的同时,允许另一个线程占用CPU完成计算操作。并发编程对于程序运行加速是非常重要的。
python由于全局锁“GIL”的原因,在许多情况下一次只能运行 一个线程,只有特定的场景,才能运行运行多个线程。
所以大家得出结论 :python的线程是个假线程。
线程必须持有 GIL 才能调用 CPython C API。
在解释器中运行的 Python 代码,例如 x = g(3,4),会使用这些 API。 每个 == 比较、每个整数加法、每个 list.append:都进行一个调用 CPython C API。 因此,线程运行 Python 代码时必须持有锁。
其他线程无法获取 GIL,因此无法运行,直到当前运行的线程释放它,这会自动每 5ms 发生一次。
GIL 在 Python 3.7 到 3.10 中默认每 5ms 释放一次,从而允许其他线程运行:
>>> import sys
>>> sys.getswitchinterval()
0.005
长时间运行(“阻塞”)的扩展代码会阻止自动切换。
然而,用 C(或其他低级语言)编写的 Python 扩展可以显式释放 GIL,从而允许一个或多个线程与持有 GIL 的线程并行运行。