在 Cpython中,这个全局解释器锁 或者 称为GIL,是一个互斥锁. 是为了防止多个本地线程同一时间执行python字节码,
这个锁是非常重要的因为Cpython的内存管理是非线程安全的, ,然而这个GIL有存在的必要性, 因为有很多已经存在的代码,需要依赖这个锁
非线程安全 即 多个线程访问同一个资源,会有有问题
线程安全 即 多个线程访问同一个资源,不会有问题
CPython中有一个互斥锁,防止线程同一时间执行python代码
该锁只存在Cpython中,这并不是Python这们语言的
之所以使用Cpython的原因??
最主要的语言,C语言以后大量现成的,库(算法,通讯),Cpython可以无缝连接C语言的任何现成代码
加锁: 只有有一个线程要使用解释器就立马枷锁
释放:
该线程任务结束
该线程遇到IO
该线程使用解释器过长 默认100纳秒
GIL给我们造成的影响
案例:
有一个下载任务 要从网络中下载一个文件 大小1G
和转换 任务 使用input 转为大写输出
上述任务并行执行,耗时也不会有太大的提升,反而开启多进程会浪费更多资源
这种任务称之为IO密集型,大量的时间都花在IO等待
这类问题使用多线程,
计算密集型任务
图像处理,语音处理,大数据分析
解决方案:
如果是IO密集使用多线程
如果是计算密集使用多进程
GIL锁与自定义锁的关系
都是互斥锁
为什么有了GIL还需要自己加锁
GIL是加在解释器上的,只能锁住,解释器内部的资源,但是无法锁住我们自己开启资源
线程池与进程池 *****
线程池
池就是容器,
线程池就是装线程的容器
好处:
1.自动管理线程的开启和销毁
2.自动分配任务给空闲的线程
3.可以线程开启线程的数量 保证系统稳定
信号量中是限制同时并发多少,但是线程已经全都建完了
如何使用:
1.创建池子
2.submit 提交任务
3.pool.shutdown() # 等待所有任务全部完毕 销毁所有线程 后关闭线程池
关闭后就不能提交新任务了