码迷,mamicode.com
首页 > 编程语言 > 详细

Python11/12--GIL/互斥锁/进程池

时间:2018-11-12 21:45:07      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:一个   executor   程序   选择   进程池   状态   全局   线程池   函数   

GIL
1.全局解释器锁?
锁就是线程里面那个锁
锁是为了避免资源竞争造成数据的错乱

2.python程序的执行过程?
1.启动解释器进程 python.exe
2.解析你的py文件并执行它

每个py程序中都必须有解释器参与,解释器其实就是一堆代码
相当于多个线程要调用同一个解释器代码,共享以为竞争,竞争就要出事
给解释器加互斥锁

python 中内存管理依赖于 GC(一段用于回收内存的代码),也需要一个线程
除了你自己开的线程,系统还有一些内置线程,就算你的代码不会去竞争解释器,内置线程也可能会竞争,所以必须加上锁
当一个线程遇到了IO 同时解释器也会自动解锁  去执行其他线程  CPU会切换到其他程序


解释器加锁以后?
将导致所有线程只能并发不能达到真正的并行,意味着同一时间只有一个CPU在处理你的线程,给你的感觉是效率低

代码执行有两种状态?
阻塞 i/o:失去CPU的执行权 (CPU等待IO完成)
非阻塞:代码正常执行,比如循环一千万次,中途CPU可能很快会切换回来 (CPU在计算)

案例:
假如有32核CPU ,要处理一个下载任务 ,网络速度慢 100k/s ,文件大小为1024kb
如果你的代码中IO操作非常多 cpu性能不能直接决定你的任务处理速度

目前有三个任务 每个任务处理需一秒 获取元数据需要一小时
3个CPU 需要 一小时1秒
1个cpu 需要 一小时3秒

在IO密集的程序中 CPU性能无法直接决定程序的执行速度 python就应该干这种活儿
在计算密集的程序中 CPU性能可以直接决定程序的执行速度

GIL 和 自定义互斥锁的区别?
全局锁不能保证自己开启的线程安全,但是保证解释器中的数据的安全的
GIL 在线程调用解释器时 自动加锁,在IO阻塞时或线程代码执行完毕时 自动解锁


进程池?
就是一个装进程的容器
为什么出现?
当进程很多的时候方便管理进程
什么时候用?
当并发量特别大的时候 例如双十一
很多时候进程是空闲的 就让他进入进程池 让有任务处理时才从进程池取出来使用
进程池使用
ProcessPoolExecutor类
创建时指定最大进程数 自动创建进程
调用submit函数将任务提交到进程池中
创建进程是在调用submit后发生的

总结一下:
进程池可以自动创建进程
进程限制最大进程数
自动选择一个空闲的进程帮你处理任务

进程什么时候算是空闲?
代码执行完算是空闲

IO密集时 用线程池
计算密集时 用进程池

Python11/12--GIL/互斥锁/进程池

标签:一个   executor   程序   选择   进程池   状态   全局   线程池   函数   

原文地址:https://www.cnblogs.com/junge666/p/9949225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!