做网站什么是解析什么是跳转,仙居做网站的,工程建设监理概论形考任务答案,国网法治建设网站python多线程Lock和RLock的区别1. 两种锁的不同1.1 定义为了确保对共享资源的访问#xff0c;python提供了两种锁#xff0c;一个是上一篇提到的Lock#xff0c;还有一个就是RLock#xff0c;他们的区别在于#xff1a;Lock是可用的最低级别的同步指令#xff0c;一个线程…python多线程Lock和RLock的区别1. 两种锁的不同1.1 定义为了确保对共享资源的访问python提供了两种锁一个是上一篇提到的Lock还有一个就是RLock他们的区别在于Lock是可用的最低级别的同步指令一个线程只能请求一次而RLock是可以被一个线程请求多次的同步指令当Lock处于锁定状态时不被特定的线程所拥有而RLock使用了“拥有的线程”和“递归等级”的概念因此处于锁定状态时可以被线程拥有1.2 死锁Lock在下面的情形下会发生死锁Lock.acquire()Lock.acquire()Lock.release()Lock.release()连续两次acquire请求会导致死锁因为第一次获得锁之后还没有释放时第二次acquire请求紧接着就到来可是acquire会让程序阻塞无法执行release()这就导致锁永远无法释放死锁是非常危险非常严重的问题1.3 可重入锁RLock就不存在1.2中所提到的死锁问题RLock.acquire()RLock.acquire()RLock.release()RLock.release()不过要保证有多少次acquire()就有多少次release()2. 怎么会多次请求锁呢最初接触到Lock和RLock这两者之间的不同之处时感到十分困惑。RLock的优势在于在同一个线程里可以多次申请锁而Lock则不能必须在释放之后才能再次申请那么这样做也没问题啊不会出现第一次申请后在释放前又申请的可能啊在编写代码的时候完全可以认为的控制这种情况的发生。然而事实并非如此我现在假设一种情形使得死锁的发生不可避免import threadingm_lock threading.Lock()def h():with m_lock:print(h)def g():with m_lock:print(g)h()g()上面的例子中h()和g()中都用了Lock在多线程环境下他们可以做到相安无事但是程序的结构总是处于变化中尤其是那些庞大的系统一个小小的变化可能牵一发而动全身假设发生了下面的变化import threadingm_lock threading.Lock()# m_lock threading.RLock()def h():with m_lock:g()print(h)def g():with m_lock:print(g)h()g()在h()函数中获得锁以后要执行g()那么此时程序就会发生死锁在大的项目里情况会比这更加复杂你很难通过眼前的几行代码发现这种死锁的情况因为很可能发生死锁的地方是在很深层次的调用过程中因此使用RLock是非常安全的选择.执行上面的代码程序不会输出任何信息也永远不会结束因为已经发生了死锁将注释的Lock替换成RLock程序立马可以执行