python 中的多线程之GIL

本文探讨了Python中的GIL及其对多线程和多进程的影响,指导在不同场景下选择CPU密集型与I/O密集型任务的解决方案,以及各方式间的效率对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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密集型下多线程效率明细

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值