zoukankan      html  css  js  c++  java
  • 关于python中的死锁

    死锁

    • 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

    例子

    from threading import Thread,Lock
    import time
    mutexA=Lock()
    mutexB=Lock()
    
    class MyThread(Thread):
        def run(self):
            self.func1()
            self.func2()
        def func1(self):
            mutexA.acquire()
            print('\033[41m%s 拿到A锁\033[0m' %self.name)
    
            mutexB.acquire()
            print('\033[42m%s 拿到B锁\033[0m' %self.name)
            mutexB.release()
    
            mutexA.release()
    
        def func2(self):
            mutexB.acquire()
            print('\033[43m%s 拿到B锁\033[0m' %self.name)
            time.sleep(2)
    
            mutexA.acquire()
            print('\033[44m%s 拿到A锁\033[0m' %self.name)
            mutexA.release()
    
            mutexB.release()
    
    if __name__ == '__main__':
        for i in range(5):
            t=MyThread()
            t.start()
    

    小故事分享

    从前有两个线程,它们分别叫线程1和线程2(假设没有其他线程跟它俩抢东西)

    1. 线程1先执行了func1的任务,所以线程1先分别拿到A锁和B锁,然后释放A锁和B锁,然后就去执行任务func2了,然后就先拿到了B锁,然后就累的睡着了
    2. 在线程1睡着的期间,线程2执行到了func1任务,刚拿到A锁,迫切的想再拿到B锁,这时发现B锁被其他线程占用了,线程2就得等线程1用完了,再轮到它用,于是它就等啊等……
    3. (two thousand years later)线程1醒了,发现自己手里的B锁,然后迫切的想拿到A锁,此时发现A锁在线程2的手里,没办法,它只能等线程2用完A锁再使用,所以它也等啊等啊……
    4. 就这样,线程1等着线程2的A锁,线程2等着线程1的B锁,就这样两个线程彼此等待着对方,不离不弃,海枯石烂……
      我凄美的爱情故事就这样讲完了,希望能从故事里得到点感悟
    世上只有10种人,一种懂二进制,一种不懂二进制
  • 相关阅读:
    中台入门系列1
    微服务 2.0 技术栈选型手册
    mysql计划任务每天定时执行
    更高效地提高redis client多线程操作的并发吞吐设计
    azure之MSSQL服务性能测试
    .NET Socket服务编程之-高效连接接入编
    轻易实现基于linux或win运行的聊天服务端程序
    零配置Socket TCP消息通讯服务容器EC
    azure存储压测的问题(农码主观意识太强被坑了)
    业务逻辑层缓存应该设计
  • 原文地址:https://www.cnblogs.com/zlxuan/p/12925624.html
Copyright © 2011-2022 走看看