我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在python中如何解决死锁的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在python中如何解决死锁的问题

这篇文章将为大家详细讲解有关在python中如何解决死锁的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.添加超时时间:

fromthreading import Thread, Lockimporttime mutex1= Lock()  # 创建一个互斥锁mutex2= Lock()  # 创建一个互斥锁
def fun1():    while True:        mutex1.acquire()        print("线程1 锁住了mutex1")        time.sleep(0.1)         result =mutex2.acquire(timeout=1)  # timeout指明acquire等的最长超时时间        # result = mutex2.acquire(False)  # 非阻塞        if result:            # 表示对mutex2成功上锁            print("线程1 锁住了mutex2")            print("线程1 hello")            mutex1.release()            mutex2.release()            break        else:            # 表示对mutex2上锁失败           mutex1.release()  # 将mutex1释放,保证别人能够执行            time.sleep(0.1)
def fun2():    mutex2.acquire()    print("线程2 锁住了mutex2")    time.sleep(0.1)    mutex1.acquire()    print("线程2 锁住了mutex1")    print("线程2 hi")     mutex1.release()    mutex2.release()

2.附录-银行家算法( 不要求,理解就可以)

背景知识

一个银行家如何将一定数目的资金安全地借给若干个客户,使这些客户既能借到钱完成要干的事,同时银行家又能收回全部资金而不至于破产,这就是银行家问题。这个问题同操作系统中资源分配问题十分相似:银行家就像一个操作系统,客户就像运行的进程,银行家的资金就是系统的资源。

问题的描述

一个银行家拥有一定数量的资金,有若干个客户要贷款。每个客户须在一开始就声明他所需贷款的总额。若该客户贷款总额不超过银行家的资金总数,银行家可以接收客户的要求。客户贷款是以每次一个资金单位(如1万RMB等)的方式进行的,客户在借满所需的全部单位款额之前可能会等待,但银行家须保证这种等待是有限的,可完成的。

例如:有三个客户C1,C2,C3,向银行家借款,该银行家的资金总额为10个资金单位,其中C1客户要借9各资金单位,C2客户要借3个资金单位,C3客户要借8个资金单位,总计20个资金单位。某一时刻的状态如图所示。

在python中如何解决死锁的问题

对于a图的状态,按照安全序列的要求,我们选的第一个客户应满足该客户所需的贷款小于等于银行家当前所剩余的钱款,可以看出只有C2客户能被满足:C2客户需1个资金单位,小银行家手中的2个资金单位,于是银行家把1个资金单位借给C2客户,使之完成工作并归还所借的3个资金单位的钱,进入b图。同理,银行家把4个资金单位借给C3客户,使其完成工作,在c图中,只剩一个客户C1,它需7个资金单位,这时银行家有8个资金单位,所以C1也能顺利借到钱并完成工作。最后(见图d)银行家收回全部10个资金单位,保证不赔本。那麽客户序列{C1,C2,C3}就是个安全序列,按照这个序列贷款,银行家才是安全的。否则的话,若在图b状态时,银行家把手中的4个资金单位借给了C1,则出现不安全状态:这时C1,C3均不能完成工作,而银行家手中又没有钱了,系统陷入僵持局面,银行家也不能收回投资。

综上所述,银行家算法是从当前状态出发,逐个按安全序列检查各客户谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户,......。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。

补充:python基础-死锁、递归锁

死锁

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

from threading import Thread,Lockimport timemutexA=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()

输出如下:

Thread-1 拿到A锁

Thread-1 拿到B锁

Thread-1 拿到B锁

Thread-2 拿到A锁

分析如上代码是如何产生死锁的:

启动5个线程,执行run方法,假如thread1首先抢到了A锁,此时thread1没有释放A锁,紧接着执行代码mutexB.acquire(),抢到了B锁,在抢B锁时候,没有其他线程与thread1争抢,因为A锁没有释放,其他线程只能等待,然后A锁就执行完func1代码,然后继续执行func2代码,与之同时,在func2中,执行代码 mutexB.acquire(),抢到了B锁,然后进入睡眠状态,在thread1执行完func1函数,释放AB锁时候,其他剩余的线程也开始抢A锁,执行func1代码,如果thread2抢到了A锁,接下来thread2要抢B锁,ok,在这个时间段,thread1已经执行func2抢到了B锁,然后在sleep(2),持有B锁没有释放,为什么没有释放,因为没有其他的线程与之争抢,他只能睡着,然后thread1握着B锁,thread2要抢B锁,ok,这样就形成了死锁

递归锁

我们分析了死锁,那么python里面是如何解决这样的递归锁呢?

在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。

这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

from threading import Thread,Lock,RLockimport timemutexA=mutexB=RLock()class MyThread(Thread):    def run(self):        self.f1()        self.f2()    def f1(self):        mutexA.acquire()        print('%s 拿到A锁' %self.name)        mutexB.acquire()        print('%s 拿到B锁' %self.name)        mutexB.release()        mutexA.release()    def f2(self):        mutexB.acquire()        print('%s 拿到B锁' % self.name)        time.sleep(0.1)        mutexA.acquire()        print('%s 拿到A锁' % self.name)        mutexA.release()        mutexB.release()if __name__ == '__main__':    for i in range(5):        t=MyThread()        t.start()

输出代码如下:

E:\python\python_sdk\python.exe "E:/python/py_pro/3 死锁现象与递归锁.py"

Thread-1 拿到A锁

Thread-1 拿到B锁

Thread-1 拿到B锁

Thread-1 拿到A锁

Thread-2 拿到A锁

Thread-2 拿到B锁

Thread-2 拿到B锁

Thread-2 拿到A锁

Thread-4 拿到A锁

Thread-4 拿到B锁

Thread-4 拿到B锁

Thread-4 拿到A锁

Thread-3 拿到A锁

Thread-3 拿到B锁

Thread-3 拿到B锁

Thread-3 拿到A锁

Thread-5 拿到A锁

Thread-5 拿到B锁

Thread-5 拿到B锁

Thread-5 拿到A锁

Process finished with exit code 0

或者如下的效果:

在python中如何解决死锁的问题

来解释下递归锁的代码:

由于锁A,B是同一个递归锁,thread1拿到A,B锁,counter记录了acquire的次数2次,然后在func1执行完毕,就释放递归锁,在thread1释放完递归锁,执行完func1代码,接下来会有2种可能,1、thread1在次抢到递归锁,执行func2代码 2、其他的线程抢到递归锁,去执行func1的任务代码

关于“在python中如何解决死锁的问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在python中如何解决死锁的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在python中如何解决死锁的问题

这篇文章将为大家详细讲解有关在python中如何解决死锁的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.添加超时时间:fromthreading import Thread, Lockimport
2023-06-14

如何解决java中的死锁问题

一、死锁的定义死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。那么我们换一个更加规范的定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的
如何解决java中的死锁问题
2016-01-19

Process的waitFor死锁问题如何解决

本篇内容主要讲解“Process的waitFor死锁问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Process的waitFor死锁问题如何解决”吧!Process的waitFor死
2023-06-22

如何解决Go语言中的死锁问题?

如何解决Go语言中的死锁问题?Go语言具有并发编程的特性,可以通过使用goroutine和channel来实现并发操作。然而,在并发编程中,死锁是一个常见的问题。当goroutine之间相互依赖于彼此的资源,并且在访问这些资源时产生了循环依
2023-10-22

SQLServer中排查死锁及死锁问题解决

目录一、背景二、本地模拟死锁1.业务场景简介2.在本地模拟死锁1). 准备数据2).执行存储过程并观察死锁发生三、死锁的详细分析1.查看死锁报告2.分析死锁报告四、解决死锁问题 一、背景我们在UAT环境压测的时候,遇到了如下的死锁异常。
SQLServer中排查死锁及死锁问题解决
2024-08-28

Oracle中如何监控并解决死锁问题

在Oracle中,可以通过以下几种方式来监控和解决死锁问题:使用Oracle Enterprise Manager(OEM)或SQL语句查询v$lock和v$session视图来监控锁和会话信息,以及识别潜在的死锁情况。当检测到死锁时,可
Oracle中如何监控并解决死锁问题
2024-04-19

C++ 函数如何解决并发编程中的死锁问题?

在 c++++ 中,使用互斥量函数可以解决多线程并发编程中的死锁问题。具体步骤如下:创建一个互斥量;当线程需要访问共享变量时,获得互斥量;修改共享变量;释放互斥量。这样可以确保任何时刻只有一个线程访问共享变量,有效防止死锁。利用 C++ 函
C++ 函数如何解决并发编程中的死锁问题?
2024-04-26

如何解决 C++ 多线程编程中常见的死锁问题?

如何解决 c++++ 多线程编程中的常见死锁问题?避免死锁的技术:加锁顺序:始终以相同的顺序获取锁。死锁检测:使用算法检测并解决死锁。超时:为锁设置超时值,防止线程无限期等待。优先级反转:分配不同的优先级,减少死锁可能性。如何解决 C++
如何解决 C++ 多线程编程中常见的死锁问题?
2024-05-13

如何利用WCF回调操作解决死锁问题

这篇文章主要介绍“如何利用WCF回调操作解决死锁问题”,在日常操作中,相信很多人在如何利用WCF回调操作解决死锁问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利用WCF回调操作解决死锁问题”的疑惑有所
2023-06-17

Java 线程死锁的问题解决办法

Java 线程死锁的问题解决办法【线程死锁】 原因:两个线程相互等待被对方锁定的资源 代码模拟:public class DeadLock { public static void main(String[] args) { Ob
2023-05-31

java 中死锁问题的实例详解

java 中死锁问题的实例详解先看代码在做解释public class DeadLock implements Runnable{ String a; String b; boolean flag; public DeadLock(
2023-05-31

Java线程技术中的死锁问题怎么解决

这篇文章主要介绍“Java线程技术中的死锁问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程技术中的死锁问题怎么解决”文章能帮助大家解决问题。我们知道,使用 synchroniz
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录