一个Python解释器同一时间只有一个线程在执行。

在CPython中有全局解释器锁(GIL,Global Interpreter Lock)。线程的 一个执行周期 需要完成获取GIL,执行,释放GIL三个步骤。如果一个线程获取了GIL但是还没有释放,那在这个时间段内其它线程就没有办法执行。这也是为什么说 一个Python解释器同一时间只能有一个线程在执行

在线程执行过程中,如下情况会释放GIL(使用线程处理任务会经过线程的多个执行周期):

  1. 当遇到I/O操作(read、write、send、recv等)时释放GIL。
  2. 对于不执行I/O操作的情况。执行sys.getcheckinterval()次“tick”后检查是否需要释放GIL。

同一时间只能有一个线程在执行。那是不是就像网上有种说法:“Python多线程是鸡肋” ?。

初学Python的时候看到一些说法:Python多线程反而会让程序更慢;Python不能充分利用多核CPU。

  1. 说Python不能充分利用多核CPU。其实可以通过开多进程来利用多核CPU。
  2. 在单核CPU上说用多线程会让程序变慢。对于计算密集型的任务是会变慢,但是对于I/O密集型的任务,多线程还是会让CPU的利用率变高。

参考资料