python 之GIL下多线程、多进程
一、了解认识GIL:
Python 中的多线程,一个绕不过去的话题就是全局锁 GIL(Global interpreter lock)。GIL 限制了同一时刻只能有一个线程运行,无法发挥多核 CPU 的优势 。GIL本质就是一把互斥锁,既然是互斥锁,所有的锁的本质都一样,将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务修改,进而保证数据安全。在一个python的进程内,不仅有主线程或者由该主线程开启其他线程,还有解释器开启的垃圾回收等解释器级别的线程。首先明确我们线程执行的任务是什么,是做计算(计算密集型CPU)还是做输入输出(I/O密集) ,不同地场景使用不同的方法。 多核 CPU,意味着可以有多个核并行完成计算,所以多核提升的是计算性能,但每个 CPU 一旦遇到 I/O 阻塞,仍然需要等待,所以多核对 I/O 密集型任务没什么太高提升。
GIL全局解释锁:GIL是一把底层工作锁,所有python解释器的线性模型都逃不过,在字节代码层次的锁,保证线程安全。
GIL是在底层的一把锁,是bytecode字节码级别的互斥锁,保证同一时刻只有一个线程控制Python解释器。
GIL带来了什么:
(1) GIL解决了Python中引用计数加锁的问题
(2) GIL使得扩展的C库和Python程序融合时资源管理更容易
(进程:操作系统的最小单位,线程:系统分配时间片资源的单位)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IAlCZ2WA-1609327674444)(C:\Users\airwe\AppData\Roaming\Typora\typora-user-images\image-20201228150946629.png)]
二、多线程、多进程的选择:
(1)对于CPU密集型的单核处理,采用多线程。
(2)对于CPU密集型的多核处理,采用多进程
(3)对于IO密集型的场景,采用多线程。
(4)对于IO密集和CPU密集型的混合场景,综合考虑进程和线程,可以以开始时的配置一个进程池,将可能的CPU密集的任务交给进程池去完成,将IO密集型的任务交给线程。
CPU密集型情况下效率情况:进程池>多进程>单进程单线程>单进程单线程
集型情况下效率情况:进程池>多进程>单进程单线程>单进程单线程
IO密集型下多线程效率明细