浅谈python中的互斥锁和GIL锁

python不能充分利用CPU多核优势

  • Python存在GIL锁(Global interpreter lock全局解释器锁),同一时刻,是只有一条线程在向前执行的
  • CPython分2步运行python程序。第一,文本形式的源代码解析并翻译成字节码,第二,基于栈的解释器来运行这份字节码
  • 执行python程序时,字节码解释器必须保持一致的状态,引入GIL机制来确保协调性。
  • GIL实际就是一把互斥锁。用以防止cpython受到占先式多线程(某个线程可以通过打断另外一个线程的方式,获取控制权限)切换操作的干扰。

支持多线程原因

  • 多线程看似能够在同一时间做许多事情。由于GIL的限制,同一时刻实际只有一个线程在执行
  • 处理阻塞式I/O操作(读写,网络通信,显示器等设备交互),python在执行某些系统调用时,会触发多线程操作。响应阻塞式请求,我们可以借助多线程,把python程序与这个耗时的I/O隔开。

互斥锁

  • 如果线程在操作某个数据结构的时候,其它线程打断他,就会破坏程序的状态,从而使相关数据结构无法保持其一致性,为了保证线程能够公平执行,python解释器会给每个线程分配大致相等的处理器时间。为了达到这样的分配策略,Python 系统可能当某个线程正在执行的时候将其暂停,然后使另一个线程继续往下执行。由于我们无法提前获知 Python 系统会在何时暂停这些线程,所以我们无法控制程序中某些操作是原子操作。
  • threading模块中提供了Lock类,相当于互斥锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值