Python多线程的理解(主要针对GIL进行分析)

多线程同步的概念

多线程同步的“同步”,指的是同步被访问的数据对象的状态(当前数据值),防止发生,例如由于多线程同时写入,而造成的数据状态冲突。

对GIL的分析

GIL的工作原理和特点分析

多核多线程模式会由于GIL被不同的核争用,其他没有GIL的核会pending,而导致多核性能会被降低为单核。

对python来说一个项目的执行,基于cpython解释器只有一个GIL,会导致出现GIL的争用。如果GPU是单核的还好,某个线程运行的时候占用GIL,用完就扔给别的线程使用,一般不会发生冲突。但是如果GPU是多核的,每个核都会运行若干线程,而这若干个核的若干线程只有一个GIL可用,会导致某个核抢到了这个GIL,并投入使用,同时其他的核会有线程被唤醒,那些没争到GIL的线程只能干等着那个占有的GIL的核的线程用完,才有可能使用到GIL进行正常的运行,如果优先级低的话,基本上很难争到GIL,导致该线程一直pending,导致其他核的线程等分配到的时钟到期了,就直接被pending了,然后再排队等待被唤醒,会进入死循环。多核中io密集型线程多还好,因为有io操作,就会有GIL的占用和释放,效率还是可以的。但是多核中只要出现一个计算密集型线程,GIL就会严重限制效率!

针对GIL缺点的解决方案

  1. 不用cpython:拒绝cpython这个解释器,换别的python解释器,但是cpython是使用最普遍的,使用别的小众的解释器,会有诸多不便,所以弃用cpython值得考虑。
  2. 不用多线程:GIL在多线程的问题就是,不同线程需要争用GIL,那就不用多线程,而只用多进程,每个进程都可以独立运行,就可以独立占用GIL,用完即弃,对其他的进程不影响,但是可能会失去多线程的优势,需要考虑。

GIL存在的意义

  1. 对IO密集型线程很友好,尽可能降低了独占GIL的影响。

notes

CPU计算能力过剩时,可以使用多线程,反之一定要用多进程,提高效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值