一、Python程序的执行过程
标准的Python实现为Cpython,它分两步来运行Python程序,
第一步:把文本形式的源代码解析并编译成字节码;
第二步:用一种基于栈的解释器来运行第一步产生的字节码。
二、确保Cpython解释器状态保持一致的方法
Python采用GIL(global interpreter lock)机制来确保一致性,以防止Cpython受到抢占式多线程切换操作的干扰。全局解释器锁(GIL)实际上是一把互斥锁,可保证每条字节码指令均能够正确地与Cpython实现及其C语言扩展模块协同运行。
用C++或Java等语言编写程序时,可以同时执行多条线程,以充分利用计算机所配备的多个CPU核心。Python程序尽管也支持多线程,但由于受到GIL保护,所以同一时刻,只能有一个线程得到执行。这就意味着,多条python线程不能在多个CPU核心上面平行地执行字节码。
三、避免用线程做平行计算,但可以用来执行阻塞式I/O
Python程序在执行某些系统调用时(程序请求操作系统与外界环境相交互,以满足程序需求),会触发阻塞式的I/O操作,如读写文件、在网络间通信,以及与显示器等设备相交互。为了响应这种阻塞式的请求,操作系统必须花一些时间,而开发者可以借助线程,把python程序与这些耗时的I/O操作隔离开。
尽管存在GIL,但是用多个线程来执行系统调用的时候,这些系统调用可以平行地执行。GIL虽然使得Python代码无法并行,但它对系统调用却没有任何负面影响,这是因为Python线程在执行系统调用的时候会释放GIL,并且一直要等到执行完毕才会重新获取它,所以GIL是不会影响系统调用的。