摘要:
在多线程环境下,python虚拟机按照以下方式运行: 1. 设置GIL(全局解释器锁) 2. 切换到一个线程中去 3. 运行 a. 指定数量的字节码的指令,或者 b. 线程主动让出控制(可以条用time.sleep(0) ) 4. 把线程设置为睡眠模式 5. 解锁GIL 6. 再次重复以上步骤调用C/C++扩展函数的时候,GIL会被锁定,直到这个函数结束。由于这期间没有python的字节码被运行,所以线程不会切换。如果我在扩展模块中调用阻塞式地I/O函数,那么就会发生比较糟糕的事情。比如说,我在扩展模块中接受网络数据,如果对端机器没有发送数据,那么我的整个Python程序就会阻塞到... 阅读全文