python中的锁

一、 全局解释器锁(GIL)

1. 什么是全局解释器锁

  在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器(cpu)使用权消失后才能使用全局解释器(cpu),即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。

 

同一时刻的某个进程下的某个线程只能被一个cpu所处理,所以在GIL锁下的线程只能被并发,不能被并行。

2. 全局解释器锁的优点

  • 避免了大量的加锁解锁的好处
  • 使数据更加安全,解决多线程间的数据完整性和状态同步

3. 全局解释器锁的缺点

  多核处理器退化成单核处理器,只能并发不能并行。

 二、同步锁

1. 什么是同步

  同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。

2. 为什么要用同步锁

  因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。

3. 怎么使用同步锁

  只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。

三、递归锁和死锁

1. 死锁

 指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源而相互等待的一个现象。

2. 递归锁

  在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。

四、信号量(semaphore)

1. 什么是信号量

  同进程的一样,semaphore管理一个内置的计数器,每当调用acquire()时内置函数-1,每当调用release()时内置函数+1。

  计数器不能为0,当计数器为0时acquire()将阻塞线程,直到其他线程调用release()。

参考文献:

【1】python基础24 -----python中的各种锁

原文地址:https://www.cnblogs.com/nxf-rabbit75/p/10565577.html