Python 的全局解释器锁 GIL 用于保护 python 解释器, 使得任意时刻, 只有一个线程在解释器中运行. 从而保证线程安全
在多线程环境中, Python 虚拟机按以下方式执行:
1. 设置 GIL
2. 切换到一个线程去运行
3. 运行:
a. 指定数量的字节码指令, 或者
b. 线程主动让出控制 (可以调用 time.sleep(0))
4. 把线程设置为睡眠状态
5. 解锁 GIL
6. 再次重复以上所有步骤
由上可知, 至少有两种情况 python 会解锁 GIL, 做线程切换: 一是一但有 IO 操作时; 线程连续执行了一定数量的指令时; 当然此处的线程切换不一定就一定会切换到其他线程执行, 因为如果当前线程 优先级比较高的话, 可能在让出锁以后, 又继续获得锁, 并优先执行.
由此可以看到, Python 多线程是单 cpu 意义上的多线程, 它和多 cpu 上的多线程有着本质的区别. GIL 会影响到那些严重依赖 CPU 的程序 (比如计算型的), 即使 Python 的多线程程序并不能利用多核 CPU 的优势;
但是如果程序大部分只会设计到 I/O, 比如网络交互, 那么使用多线程就很合适, 因为它们大部分时间都在等待.
来源: http://www.bubuko.com/infodetail-2699631.html