1、Lock:同步锁
可以叫:互斥锁以及
它们是什么意思呢?
互斥指的是某一资源同一时刻仅能有一个访问者对其进行访问,具有性和排他性,但是互斥无法限制访问者对资源的访问顺序,即访问是无序的
同步是指在互斥的基础上(大多数情况),通过其他机制实现访问者对资源的有序访问
同步其实已经实现了互斥,是互斥的一种更为复杂的实现,因为它在互斥的基础上实现了有序访问的特点
下面是threading模块与同步锁提供的相关方法:
方法: 描述
threading.Lock() 返回一个同步锁对象
lockObject.acquire(blocking=True, timeout=1) 上锁,当一个线程在执行被上锁代码块时,将不允许切换到其他线程运行,默认锁失效时间为1秒
lockObject.release() 解锁,当一个线程在执行未被上锁代码块时,将允许系统根据策略自行切换到其他线程中运行
lockObject.locaked() 判断该锁对象是否处于上锁状态,返回一个布尔值
使用方式
同步锁一次只能放行一个线程,一个被加锁的线程在运行时不会将执行权交出去,只有当该线程被解锁时才会将执行权通过系统调度交由其他线程
如下所示,使用同步锁解决上面的问题:
这样这个代码就完全变成了串行的状态,对于这种计算密集型I/O业务来说,还不如直接使用串行化单线程执行来得快,所以这个例子仅作为一个示例,不能概述锁真正的用途。
死锁现象
对于同步锁来说,一次acquire()必须对应一次release(),不能出现连续重复使用多次acquire()后再重复使用多次release()的操作,这样会引起死锁造成程序的阻塞,完全不动了,如下所示:
with语句
由于threading.Lock()对象中实现了enter__()与__exit()方法,故我们可以使用with语句进行上下文管理形式的加锁解锁操作:
剩下两张图示有需要可随时联系我
新上厦门BGP机器,有需要可随时联系我,价优全城!