碎片化时代,无论是生活中,还是代码中,锁的概念无处不在。大家都是在不断的锁与解锁中奋斗自己的生活,为了节省大家的时间,这里花1分钟搞懂python的5种进程锁。

目录

锁的概念

5种锁

联系


锁的概念

进程在这里就不多解释了,如果不涉及到多线程编程,就可以忽略此文了。锁是为了代码上的进程安全,比较容易理解的一个例子是:当没有锁的时候,两个进程同时对一个num进行加1和减1操作,10000次以后,会发现结果是不等于0的。

一个更易理解的生活例子是:一个房间(进程)中有10颗糖(资源),有3个小人(1个主线程、2个子线程),当小人A吃了3颗糖后被系统强制进行休息时他认为还剩下7颗糖,而当小人B工作后又吃掉了3颗糖,那么当小人A重新上岗时会认为糖还剩下7颗,但是实际上只有4颗了。

5种锁

python中自然也少不了进程锁,按照功能,分为下面的5种:

  • 同步锁:lock(一次只能放行一个)
  • 递归锁:rlock(一次只能放行一个)
  • 条件锁:condition(一次可以放行任意个)
  • 事件锁:event(一次全部放行)
  • 信号量锁:semaphore(一次可以放行特定个)

联系

同步锁是基础,主要是实现访问者对资源的有序访问,记住acquire和release,后面会经常用到。

递归锁同步锁的升级,在同步锁的基础上可以做到连续重复使用多次acquire()后再重复使用多次release()的操作,但是加锁次数和解锁次数必须一致,否则也将引发死锁现象。

条件锁是在递归锁的基础上增加了能够暂停线程运行的功能。并且我们可以使用wait()与notify()来控制线程执行的个数。

事件锁是基于条件锁来做的,它与条件锁的区别在于一次只能放行全部,不能放行任意个数量的子线程继续运行。我们可以将事件锁看为红绿灯,当红灯时所有子线程都暂停运行,并进入“等待”状态,当绿灯时所有子线程都恢复“运行”。

信号量锁也是根据条件锁来做的,与上面的锁的区别在于:通过规定,成批的放行特定个处于“上锁”状态的线程,个人认为是事件锁的升级版。

具体这些锁的应用及代码,本文就不详述了,有兴趣的朋友可以参考下文:

Python 中最常用的 5 种线程锁你会用吗?