python 代码的执行由python虚拟机来控制,虚拟机访问由GIL控制,保证其同一时刻只有一条线程运行。
虽然python能运行多线程,但是因为GIL所以同一时刻只有一条线程在python解释器运行。
多线程下python虚拟机按以下方式执行:
1. 设置GIL
2. 切换到一条线程去运行
3. 运行:
a. 执行python2虚拟机运行1000字节指令 或者 执行python3虚拟机运行时间15ms字节
b. 线程主动让出控制(遭遇sleep或者IO操作也将触发)
4. 把线程设置为睡眠状态(等待状态)
5. 释放GIL
6. 再次重复上述操作
线程何时切换?
==========================================================
(1)一个线程无论何时开始睡眠或等待网络 I/O,其他线程总有机会获取 GIL 执行 Python 代码。这是协同式多任务处理。CPython 也还有抢占式多任务处理。如果一个线程不间断地在 Python 2 中运行 1000 字节码指令,或者不间断地在 Python 3 运行15 毫秒,那么它便会放弃 GIL,而其他线程可以运行。把这想象成有多个线程但只有一个 CPU 时的时间片可用