Python的多线程

392 阅读2分钟

多线程的优势

多线程可以充分利用CPU的性能优势。现在CPU多核是标配,多核CPU完全有能力同时执行多个程序,从而减少程序运行时间。

很可惜,python不能充分利用多核CPU的优势

python里有全局解释器锁:GIL,global interpreter lock。它的作用是不管你CPU有多少个核,也不管你开了多少个线程,同一时刻,只能在一个核上执行一个线程。

因此,无论你CPU多强大,可以同时执行大量的线程,然而python的GIL都会限制成一核一线程。

为什么python要设计成这样呢?

在多线程里一般会有“锁”的概念,主要作用是防止多个线程同时操作一个资源导致混乱的问题。也即只有拿到锁的这个线程才能操作相关资源。

锁可以分为两种:

  • 细粒度的锁:通过写代码主动加锁
  • 粗粒度的锁:在解释器层面加锁,python里就是GIL全局解释器锁

虽然硬件层面,多核CPU可以跑多个线程,但是由于GIL的存在,在python的解释器上,同一时刻,只允许一个线程执行。

python利用这种机制,一定程度上保证了线程安全,也就是防止了多个线程同时操作一个资源导致混乱的问题。(当然没有完全防止,涉及到了python解释器对bytecode的问题)

另外:python是语言的规范,关键起作用的是不同的语言解释器,常见的有两个:

  • cpython
  • jpython GIL全局解释器锁只是cpython里的实现,jpython没有。

python的多线程到底是不是鸡肋?

并不是,不然node.js的单进程单线程岂不是更鸡肋。

具体分析。如果现在有10个线程,它们都严重依赖CPU的计算,也就是CPU 密集型程序:圆周率计算,视频解码,那么这种情况下,python的多线程确实是鸡肋了。

但是,我们编写的大部分程序其实是IO密集型程序:查数据库,请求网络资源,读写文件。

python的多线程在IO密集型程序同样可以发挥多线程的优势。