一、死锁问题

  1. 例子
import threading

import time

​

lock_1 = threading.Lock()

lock_2 = threading.Lock()

​

def func_1():

    print("func_1 starting......")

    lock_1.acquire()#我先占上lock_1

    print("func_1 申请了 lock_1.....")

    time.sleep(2)#必须得等一下啊,让这这两个函数形成死锁

    print("func_1 等待lock_2......")

    lock_2.acquire()

    print("func_1 申请了lock_2")

    lock_2.release()

    print("func_1 释放了 lock_2")

    lock_1.release()

    print("func_1 释放了 lock_1")

​

    print("func_1 done")

​

def func_2():

    print("func_2 staring......")

    lock_2.acquire()#我先占上lock_2

    print("func_2申请了lock_2.....")

    time.sleep(4)

    print("func_2等待lock_1.......")

    lock_1.acquire()

    print("func_2申请了lock_1.....")

    lock_1.release()

    print("func_2 释放了 lock_1")

    lock_2.release()

    print("func_2 释放了 lock_2")

​

    print("func_2 done")

​

if __name__ == "__main__":

    t1 = threading.Thread(target=func_1,args=())

    t2 = threading.Thread(target=func_2,args=())

​

    t1.start()

    t2.start()

​

    t1.join()

    t2.join()

2.解决方式

我们加入判断语句,对申请不到的锁就不申请了,直接走下去

关注里面的rst = lock_4.acquire(timeout=-1)#可见这是一个返回值是布尔类型的变量,timeout代表超时跳

lock_3 = threading.Lock()

lock_4 = threading.Lock()

​

def func_3():

    print("func_3 starting.....")

    lock_3.acquire(timeout=-1)

    print("func_3 申请了lock_3.....")

    time.sleep(2)

    print("func_3 等待lock_4.......")

​

    rst = lock_4.acquire(timeout=-1)#可见这是一个返回值是布尔类型的变量,timeout代表超时跳出

    if rst:

        print("func_3的带了锁lock_4")

        lock_4.release()

        print("func_3释放了lock_4")

    else:

        print("func_3没申请到lock_4")

​

    lock_3.release()

    print("func_3释放了lock_3")

​

    print("func_3 done......")

​

​

def func_4():

    print("func_4 starting.....")

    lock_4.acquire(timeout=4)

    print("func_4 申请了lock_4.....")

    time.sleep(2)

    print("func_4 等待lock_3.......")

​

    rst = lock_3.acquire(timeout=2)

    if rst:

        print("func_3得到了了锁lock_3")

        lock_3.release()

        print("func_4释放了lock_3")

    else:

        print("func_4没申请到lock_3")

​

    lock_4.release()

    print("func_4释放了lock_4")

​

    print("func_4 done......")

​

if __name__ == "__main__":

​

    t3 = threading.Thread(target=func_3,args=())

    t4 = threading.Thread(target=func_4,args=())

​

    t3.start()

    t4.start()

​

    t3.join()

    t4.join()

解决了冲突,但是实际上没有解决这个死锁问题,但是这已经足够,本就应该避免出现这种问题

二、源码

d25_3_dead_lock.py

https://github.com/ruigege66/Python_learning/blob/master/d25_3_dead_lock.py

2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,后台回复”礼包“,获取大数据学习资料

Python连载35-死锁问题以及解决方式的更多相关文章

  1. python——报错ImportError:DLL load failed with error code -1073741795的解决方式

    python中导入一个包,import cv2总是报错'ImportError:DLL load failed with error code -1073741795',报错形式: 网上找了好久的解决 ...

  2. 【python系列】python画报表(Chartkick、Flask)(附中文乱码解决方式)

    chartkick 能够画 javascript 报表, 并且比較美观.可是网上搜了下.非常难找到 python 版本号的,于是查了些资料,摸索了下. 对 Flask 也不非常熟悉,这里就仅仅抛砖引玉 ...

  3. NAT的全然分析及其UDP穿透的全然解决方式

    NAT的全然分析及其UDP穿透的全然解决方式   一:基本术语 防火墙 防火墙限制了私网与公网的通信,它主要是将(防火墙)觉得未经授权的的包丢弃,防火墙仅仅是检验包的数据,并不改动数据包中的IP地址和 ...

  4. ubuntu下编译时遇到的错误及解决方式

    1.错误展示: hangma@ubuntu:~/test/test/protest/stack_test$ gcc  -c my_stack.c -o my_stack.o In file inclu ...

  5. 转:python idle 清屏问题的解决

    http://www.cnblogs.com/maybego/p/3234055.html python idle 清屏问题的解决 在学习和使用python的过程中,少不了要与python idle打 ...

  6. python输出htmltestrunner中文乱码如何解决

    python unittest要产生一个可看的报告,需要借助一个第三方的包 下载HTMLTestRunner.py 第三方库 ,参考地址: http://tungwaiyip.info/softwar ...

  7. Circular dependency issuse on cocoapods version(0.36.0) 全然解决方式(非降版本号)

    此前的文章中.以前提到在cocoapods依赖管理版本号假设超过0.34.4.比方0.35, 0.36.0等版本号中. 运行"pod install" 或者 "pod u ...

  8. 通过py2exe打包python程序的过程中,解决的一系列问题

    py2exe的使用方法参考<py2exe使用方法>. 注:程序可以在解释器中正常运行,一切问题都出在打包过程中. 问题1: 现象:RuntimeError: maximum recursi ...

  9. mixare的measureText方法在频繁调用时抛出“referencetable overflow max 1024”的解决方式

    这几天在搞基于位置的AR应用,採用了github上两款开源项目: mixare android-argument-reality-framework 这两个项目实现机制大致同样.我选取的是androi ...

随机推荐

  1. maven-build-downloading

    1. 场景描述 maven库用的是公司私服和阿里云结合的方式(maven多仓库配置),本项目maven依赖的有其他项目组的jar包(单点登录),但是天有不测风云,依赖单点登录的好几个jar包,在编译( ...

  2. Ubuntu 执行chmod -R 777 / 挽救方法

    mgj怎么会有堪比rm -rf /*这样神奇的命令,本想着把当前目录下的权限改为777,没想到把整个/目录下全设成777了,直觉告诉我好像哪里有些不对劲,好在一顿xjb折腾最终弄好了,应该没啥大问题, ...

  3. Samba:基于公网 IP 的服务访问

    写在前面的话 由于使用过程中,发现如果 Samba 只用于内网访问,同事在外面甚至其它不是一个网段的同事就无法访问了.这显然不符合我们最终的需求,最后没法,只能把访问部署到云服务器上面去,此时问题来了 ...

  4. 【0807 | Day 10】字符编码以及Python2/3编码的区别

    一.计算机基础 计算机组成:CPU.内存.硬盘 CPU:控制程序运行(从内存中取出文本编辑器的数据存入内存) 内存:运行程序 硬件:存储数据 二.文本编辑器存取文件的原理 比如计算机只能识别0和1,文 ...

  5. Linux--shell练习题

    1.判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否者显示”/etc/inittab is a small file.” ...

  6. let 、const 、var、function声明关键字的新理解

    今天在群里看到大佬们讨论let .const 的提升问题,有个大佬问  三种声明都在什么阶段提升?  什么阶段?这个真不清楚,以前是只知道let.const存在死区,没有变量提升,一下子就懵了 后经手 ...

  7. Map集合的遍历(利用entry接口的方式)

    核心思想: 调用map集合中的方法entrySet()将集合中的映射关系存放在Set集合中. 迭代Set集合 获取出的Set集合的元素是映射关系对象 通过映射关系对象方法的getKey(),getVa ...

  8. set集合的常用方法

    set集合是一种无序不重复的集合   add  (self, *args, **kwargs)                                                      ...

  9. 实时计算大数据处理的基石-Google Dataflow

    ​ 此文选自Google大神Tyler Akidau的另一篇文章:Streaming 102: The world beyond batch ​ 欢迎回来!如果您错过了我以前的帖子,Streaming ...

  10. 消息中间件——RabbitMQ(七)高级特性全在这里!(上)

    前言 前面我们介绍了RabbitMQ的安装.各大消息中间件的对比.AMQP核心概念.管控台的使用.快速入门RabbitMQ.本章将介绍RabbitMQ的高级特性.分两篇(上/下)进行介绍. 消息如何保 ...