全局解释器锁(GIL Global Interpreter Lock )
GIL锁与python语言并没有什么关系,仅仅是用C语言编写的cpython解释器中存在GIL锁。
在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他线程就必须等待该线程使用结束后才能继续使用
好处:
1.避免了大量的加锁减锁
2. 使数据更加安全
缺点:
多核处理器退化成单核处理器,只能并发不能并行。GIL只会影响严重依赖CPU的程序
解决方法:
1.用多进程代替多线程。每一个Python进程都有自己的Python 解释器和内存空间。但是进程相互之间是独立的,所以要解决进程之间的数据通信问题,可以用queue解决。
2.可以换一个Python解释器 比如 jpython。
3.python语言的特性就是可以作为胶水语言,所以在子线程部分可以不用python语言写,用其他语言写。
Python线程的切换:
1.对于IO操作的线程,当一个线程做IO操作时,IO操作不需要CPU,所以这个时候Python就会释放GIL锁,其他需要运行的线程就会使用该锁。
2.对于CPU密集型的线程,Python中会有一个执行指令的计数器,当一个线程执行了一定数量的指令时,该线程就会停止执行并让出当前的锁,但是如果当前线程的优先级很高,那么有可能在结束后会继续获取GIL锁继续运行。