"""
1、整理GIL解释器锁,解释以下问题
1、什么是GIL
是Cpython中的全局解释器锁,是一种互斥锁,是为了防止多个本地线程
同一时间执行python字节码
2、有了GIL会对单进程下的多个线程造成什么样的影响
造成多线程不能并行执行
3、为什么要有GIL
因为Cpython的内存管理是非线程安全的,然而GIL尤其存在的必要性可以防止
多个本地线程同一时间执行python字节码,同时已经存在很多代码需要依赖这个锁了
4、GIL与自定义互斥锁的区别,多个线程争抢GIL与自定义互斥锁的过程分析
他们都是互斥锁,但GIL是加在python解释器上的,只能锁住解释器内部的资源,但无法锁住我们
自己开启的资源、自己开启的共享资源还需要自己锁
但例如申请内存,保存数据等等就不需要我们程序员自己考虑了,GIL已经搞定了
5、什么时候用python的多线程,什么时候用多进程,为什么?
如果是IO密集时使用多线程如果时计算密集时使用多进程
"""
"""
2、进程池与线程池
1、池的用途,为何要用它
池时一个容器,线程池就是装线程的容器,
可以使用它来管理线程的开启与销毁
自动分配任务给空闲的线程
可以控制线程开启的数量,保证系统的稳定
2、池子里什么时候装进程什么时候装线程?
"""
熟悉python的都知道,在C语言写的python解释器中存在全局解释器锁,由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。而这个解释器锁由于历史原因,现在几乎无法消除。
python GIL 之所以会影响多线程等性能,是因为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行,而全局锁只有一个,所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能。
既然python在同一时刻下只能运行一个线程的代码,那线程之间是如何调度的呢?
对于有io操作的线程,当一个线程在做io操作的时候,因为io操作不需要cpu,所以,这个时候,python会释放python全局锁,这样其他需要运行的线程就会使用该锁。
对于cpu密集型的线程,比如一个线程可能一直需要使用cpu做计算,那么python中会有一个执行指令的计数器,当一个线程执行了一定数量的指令时,该线程就会停止执行并让出当前的锁,这样其他的线程就可以执行代码了。
由上面可知,至少有两种情况python会做线程切换,一是一但有IO操作时,会有线程切换,二是当一个线程连续执行了一定数量的指令时,会出现线程切换。当然此处的线程切换不一定就一定会切换到其他线程执行,因为如果当前线程 优先级比较高的话,可能在让出锁以后,又继续获得锁,并优先执行。
在做科学计算的时候是用的单线程,因为这种计算是需要CPU一直做计算的,如果用多线程反而会降低计算速度。