python死锁和解决方案递归锁

何谓死锁

# 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,
# 若无外力作用,它们都将无法推进下去。
# 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

  

何谓递归锁

# 解决方案:将所有锁改编成递归锁RLock
# 在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。
# 这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。
# 直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁。

# 不要瞧不起最原始的串行,那是解决线程安全问题最原始最有效的方法
# RLock = threading.RLock()
# RLock 代替所有mutex

  

代码详细

import threading
import time

# mutexA = threading.Lock()
# mutexB = threading.Lock()
RLock = threading.RLock()

class MyThread(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        self.fun1()
        self.fun2()

    def fun1(self):
        RLock.acquire()  # 如果锁被占用,则阻塞在这里,等待锁的释放

        print ("I am %s , get res: %s---%s" %(self.name, "ResA",time.time()))

        RLock.acquire()
        print ("I am %s , get res: %s---%s" %(self.name, "ResB",time.time()))
        RLock.release()

        RLock.release()


    def fun2(self):
        RLock.acquire()
        print ("I am %s , get res: %s---%s" %(self.name, "ResB",time.time()))
        time.sleep(0.2)

        RLock.acquire()
        print ("I am %s , get res: %s---%s" %(self.name, "ResA",time.time()))
        RLock.release()

        RLock.release()

if __name__ == "__main__":

    print("start---------------------------%s"%time.time())

    for i in range(0, 10):
        my_thread = MyThread()
        my_thread.start()

  




posted @ 2017-09-21 13:29  Adamanter  阅读(447)  评论(0编辑  收藏  举报