python不能充分利用CPU多核优势
- Python存在GIL锁(Global interpreter lock全局解释器锁),同一时刻,是只有一条线程在向前执行的
- CPython分2步运行python程序。第一,文本形式的源代码解析并翻译成字节码,第二,基于栈的解释器来运行这份字节码
- 执行python程序时,字节码解释器必须保持一致的状态,引入GIL机制来确保协调性。
- GIL实际就是一把互斥锁。用以防止cpython受到占先式多线程(某个线程可以通过打断另外一个线程的方式,获取控制权限)切换操作的干扰。
支持多线程原因
- 多线程看似能够在同一时间做许多事情。由于GIL的限制,同一时刻实际只有一个线程在执行
- 处理阻塞式I/O操作(读写,网络通信,显示器等设备交互),python在执行某些系统调用时,会触发多线程操作。响应阻塞式请求,我们可以借助多线程,把python程序与这个耗时的I/O隔开。
互斥锁
- 如果线程在操作某个数据结构的时候,其它线程打断他,就会破坏程序的状态,从而使相关数据结构无法保持其一致性,为了保证线程能够公平执行,python解释器会给每个线程分配大致相等的处理器时间。为了达到这样的分配策略,Python 系统可能当某个线程正在执行的时候将其暂停,然后使另一个线程继续往下执行。由于我们无法提前获知 Python 系统会在何时暂停这些线程,所以我们无法控制程序中某些操作是原子操作。
- threading模块中提供了Lock类,相当于互斥锁