关于python中的死锁

Posted Li_Xuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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(‘33[41m%s 拿到A锁33[0m‘ %self.name)

        mutexB.acquire()
        print(‘33[42m%s 拿到B锁33[0m‘ %self.name)
        mutexB.release()

        mutexA.release()

    def func2(self):
        mutexB.acquire()
        print(‘33[43m%s 拿到B锁33[0m‘ %self.name)
        time.sleep(2)

        mutexA.acquire()
        print(‘33[44m%s 拿到A锁33[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锁,就这样两个线程彼此等待着对方,不离不弃,海枯石烂……
    我凄美的爱情故事就这样讲完了,希望能从故事里得到点感悟

以上是关于关于python中的死锁的主要内容,如果未能解决你的问题,请参考以下文章

关于死锁的一些概念

12_关于flask中的宏

使用底图作为Python GUI中的图形

操作系统关于多线程同步中的死锁问题一篇文章让你彻底搞明白死锁到底是什么情况及如何解决死锁

sqlserver-处理死锁

一篇文章搞清JVM死锁问题及排查