GIL与进程池线程池

在 Cpython中,这个全局解释器锁 或者 称为GIL,是一个互斥锁. 是为了防止多个本地线程同一时间执行python字节码,

这个锁是非常重要的因为Cpython的内存管理是非线程安全的, ,然而这个GIL有存在的必要性, 因为有很多已经存在的代码,需要依赖这个锁

非线程安全 即 多个线程访问同一个资源,会有有问题

线程安全 即 多个线程访问同一个资源,不会有问题

CPython中有一个互斥锁,防止线程同一时间执行python代码

该锁只存在Cpython中,这并不是Python这们语言的

之所以使用Cpython的原因??

C编译过的结果可以计算机直接识别

最主要的语言,C语言以后大量现成的,库(算法,通讯),Cpython可以无缝连接C语言的任何现成代码

加锁: 只有有一个线程要使用解释器就立马枷锁

释放:

该线程任务结束

该线程遇到IO

该线程使用解释器过长 默认100纳秒

GIL给我们造成的影响

多线程不能并行

案例:

有一个下载任务 要从网络中下载一个文件 大小1G

和转换 任务 使用input 转为大写输出

上述任务并行执行,耗时也不会有太大的提升,反而开启多进程会浪费更多资源

这种任务称之为IO密集型,大量的时间都花在IO等待

这类问题使用多线程,

计算密集型任务

图像处理,语音处理,大数据分析

解决方案:

区分任务类型

如果是IO密集使用多线程

如果是计算密集使用多进程

GIL锁与自定义锁的关系

都是互斥锁

为什么有了GIL还需要自己加锁

GIL是加在解释器上的,只能锁住,解释器内部的资源,但是无法锁住我们自己开启资源

 

线程池与进程池 *****

线程池

池就是容器,

线程池就是装线程的容器

好处:

1.自动管理线程的开启和销毁

2.自动分配任务给空闲的线程

3.可以线程开启线程的数量 保证系统稳定

信号量中是限制同时并发多少,但是线程已经全都建完了

如何使用:

1.创建池子

2.submit 提交任务

3.pool.shutdown() # 等待所有任务全部完毕 销毁所有线程 后关闭线程池

关闭后就不能提交新任务了

猜你喜欢

转载自www.cnblogs.com/huanghongzheng/p/10981742.html
今日推荐