GIL锁
GIL锁:
全局解释器锁。
是指只能每次进行一个线程,线程在执行的是时候都加上了GIL锁,不能同时执行多个线程。所以使用python多线程,在同一时刻也只有一个线程在运行,因此即使在多核的情况下也只能发挥出单核的性能。
GIL锁造成的原因:
不是Python语言的原因,而是CPython解释器历史缘故遗留的。
如何解决GIL锁:
1、换解释器,不使用由C语言编的解释器即可,有许多的解释器。
2、调用其他的语言实现多线程。
多线程使用场景和不该使用的场景:
虽然多线程受全局解释器锁(GIL)的影响,但是它IO密集型的时候依旧比单线程的效率高。是因为IO密集型的时候会有延迟,多线程是在不断的切换每个线程,在该线程在堵塞的时候就会切换另外一个线程执行,如此一来就会在堵塞的时间执行其他的线程。单线程在堵塞的时间完全浪费,所以多线程在IO密集型的时候还是效果很不错的。
在计算密集型的时候就不可以使用多线程,多线程并不能发挥出电脑多核的资源,完全用一个核进行计算。因为大量计算是个没有阻塞的,程序在不断的执行,所以多线程对其毫无作用,因此多线程不试用于计算密集型的程序。计算密集型的程序需用使用进程来执行,因为进程可以使用电脑多核的资源,进而效率会比线程的效率高。
去掉GIL锁:
Python的创始人是有尝试去抹掉GIL锁的,但是由于线程中的资源是共享的,所在抹去解释器的GIL锁之后还是要保证数据的安全性就必须要加上各种锁,反而使其效率变得不如没抹去GIL的效率,所以GIL锁就一直保留下来了。