当解释器通过字节码时,它会定期放弃GIL,而不需要经过正在执行代码的线程允许,这样其他线程便能运行。
默认情况下,检测间隔是1000 字节码。所有线程都运行相同的代码,并以相同的方式定期从他们的锁中抽出。在 Python 3 GIL 的实施更加复杂,检测间隔不是一个固定数目的字节码,而是15 毫秒。然而,对于你的代码,这些差异并不显著。
Python很多原子操作线程不会被打断Python 的标准 dis 模块编译的字节码
1 |
|
协同式多任务处理
当一项任务比如网络 I/O启动,而在长的或不确定的时间,没有运行任何 Python 代码的需要,一个线程便会让出GIL,从而其他线程可以获取 GIL 而运行 Python[线程主动出让GIL]。这种礼貌行为称为协同式多任务处理,它允许并发;多个线程同时等待不同事件。
1 |
|
简而言之:当N个线程在网络 I/O 堵塞,或等待重新获取GIL,而一个线程运行Python。 [一人工作多人围观]