python-锁机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-锁机制相关的知识,希望对你有一定的参考价值。

 1  2 Lock()
 3 
 4 Lock(指令锁)是可用的最低级的同步指令。Lock处于锁定状态时,不被特定的线程拥有。Lock包含两种状态——锁定和非锁定,以及两个基本的方法。 
 5 可以认为Lock有一个锁定池,当线程请求锁定时,将线程至于池中,直到获得锁定后出池。池中的线程处于状态图中的同步阻塞状态。
 6 构造方法: 
 7 Lock()
 8 实例方法: 
 9 acquire([timeout]): 使线程进入同步阻塞状态,尝试获得锁定。 
10 release(): 释放锁。使用前线程必须已获得锁定,否则将抛出异常
11 
12 重入锁 
13 RLock()
14 RLock(可重入锁)是一个可以被同一个线程请求多次的同步指令。RLock使用了“拥有的线程”和“递归等级”的概念,处于锁定状态时,RLock被某个线程拥有。拥有RLock的线程可以再次调用acquire(),释放锁时需要调用release()相同次数。
15 可以认为RLock包含一个锁定池和一个初始值为0的计数器,每次成功调用 acquire()/release(),计数器将+1/-1,为0时锁处于未锁定状态。
16 构造方法: 
17 RLock()
18 实例方法: 
19 acquire([timeout])/release(): 跟Lock差不多。
20 
21 互斥锁 Condition
22 互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。
23 除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制,处于waiting状态的线程只能通过notify方法唤醒,所以notifyAll的作用在于防止有线程永远处于沉默状态。
24 实例方法:
25 acquire([timeout])
26 notify()
27 notifyAll()
28 release()

 

以上是关于python-锁机制的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

python-锁机制

python 多线程锁机制

Python多线程同步

3.2.6 Python的GIL锁内部机制

Python 进程线程协程锁机制,你知多少?