立即学习:https://edu.csdn.net/course/play/24458/296445?utm_source=blogtoedu

1.死锁(Lock()的局限性)

知识点:Lock()只能被获得(acquire)一次,要想再次获得必须释放后才能获得

1)死锁情况1

#死锁情况1
from threading import Thread,Lock
import time
#设置了两把互斥锁
mutexA = Lock()
mutexB = Lock()class mythread(Thread):def run(self):self.f1()self.f2()def f1(self):#首先线程1获得了A锁,再获得B锁,最后两个都释放,开始进行f2中的B锁,因为沉睡了0.1秒,足以让线程2获得f1中的A锁,接下来线程1的工作是沉睡结束后获得A锁,线程2准备获得B锁,一直处于等待锁的释放,因为线程1和线程2都是在等待彼此手中的那把锁,因此形成了死锁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(10):t = mythread()t.start()

2)死锁情况2

#死锁情况2
from threading import Thread,Lock
import time
#设置了两把互斥锁,且是同一把锁
mutexA = mutexB = Lock()class mythread(Thread):def run(self):self.f1()def f1(self):#首先线程1获得了A锁,再获得B锁,最后两个都释放,开始进行f2中的B锁,因为沉睡了0.1秒,足以让线程2获得f1中的A锁,接下来线程1的工作是沉睡结束后获得A锁,线程2准备获得B锁,一直处于等待锁的释放,因为线程1和线程2都是在等待彼此手中的那把锁,因此形成了死锁mutexA.acquire()print('%s获取到了A锁'%self.name)mutexB.acquire()print('%s获取到了B锁'%self.name)mutexB.release()mutexA.release()if __name__ == '__main__':#线程切换的速度非常快,因此可以看成是依次线程执行的for i in range(10):t = mythread()t.start()

2.递归锁(RLock):可以解决死锁的问题

知识点:RLock(),

1)支持被同一个线程连续多次被获取(acquire),

2)内置一个计数器,同一线程每acquire一次,计数器+1,每release·一次,计数器-1,一直到计数器归零,这把递归锁才能被其他线程获取(acquire)

#递归锁情况
from threading import Thread,RLock
import time
#设置了两把互斥锁
mutexA = mutexB = RLock()class mythread(Thread):def run(self):self.f1()self.f2()def f1(self):#首先线程1获得了A锁计数器+1为1,再获得B锁计数器+1为2,最后两个都释放计数器归零,锁可以被其他线程获取,因为线程速度快,所以线程1获取到了f2的B锁,计数器为1,因为沉睡了0.1秒且线程1的计数器为1,虽然足以让线程2去获得f1中的A锁,但是条件不允许啊(计数器不归零),接下来线程1的工作是沉睡结束后获得A锁,计数器为2,线程1释放两次后计数器为0,线程2立马获得锁,不一定是线程2获得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(10):t = mythread()t.start()
#运行结果
'''
"F:\software install\python3.6.4\python.exe" C:/Users/jinlin/Desktop/python_further_study/并发编程/死锁与递归锁(Rlock).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-6获取到了A锁
Thread-6获取到了B锁
Thread-6获取到了B锁
Thread-6获取到了A锁
Thread-8获取到了A锁
Thread-8获取到了B锁
Thread-8获取到了B锁
Thread-8获取到了A锁
Thread-10获取到了A锁
Thread-10获取到了B锁
Thread-10获取到了B锁
Thread-10获取到了A锁
Thread-5获取到了A锁
Thread-5获取到了B锁
Thread-5获取到了B锁
Thread-5获取到了A锁
Thread-9获取到了A锁
Thread-9获取到了B锁
Thread-9获取到了B锁
Thread-9获取到了A锁
Thread-7获取到了A锁
Thread-7获取到了B锁
Thread-7获取到了B锁
Thread-7获取到了A锁
Thread-3获取到了A锁
Thread-3获取到了B锁
Thread-3获取到了B锁
Thread-3获取到了A锁进程已结束,退出代码0
'''

学习笔记(28):Python网络编程并发编程-死锁与递归锁相关推荐

  1. 学习笔记(19):Python网络编程并发编程-互斥锁

    立即学习:https://edu.csdn.net/course/play/24458/296430?utm_source=blogtoedu 1.互斥锁: 多进程间的内存是相互隔离的,因此其数据也是 ...

  2. 学习笔记(34):Python网络编程并发编程-异步调用与回调机制

    立即学习:https://edu.csdn.net/course/play/24458/296452?utm_source=blogtoedu 1.知识点:(详细见代码注释) 1)同步调用: res1 ...

  3. 学习笔记(33):Python网络编程并发编程-进程池线程池

    立即学习:https://edu.csdn.net/course/play/24458/296451?utm_source=blogtoedu 进程池与线程池: 一般应用在网站上,进程池或线程池最大的 ...

  4. 学习笔记(18):Python网络编程并发编程-守护进程

    立即学习:https://edu.csdn.net/course/play/24458/296429?utm_source=blogtoedu 守护进程(了解) 1.概念:守护进程是主进程在创建子进程 ...

  5. 学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现

    立即学习:https://edu.csdn.net/course/play/24458/296239?utm_source=blogtoedu 1.服务器端:接收客户端发送的命令,subprocess ...

  6. 学习笔记(08):Python网络编程并发编程-实现服务端可以对多个客户端提供服务

    立即学习:https://edu.csdn.net/course/play/24458/296237?utm_source=blogtoedu 链接循环,一个服务器服务多个客户端, 思路1:服务器一个 ...

  7. Python网络与并发编程 10 threading模块线程锁

    前言 本章节将继续围绕threading模块讲解,基本上是纯理论偏多. 对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题. 官方文档 线程安全 线程安 ...

  8. python 网页爬虫作业调度_第3次作业-MOOC学习笔记:Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业. 4.提供图片或网站显示的学习 ...

  9. 7.3.7 - 并发多线程 死锁和递归锁

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

最新文章

  1. java io 网络编程_[笔面] Java IO和网络编程相关面试
  2. 7-26复习重载并实现重载部分符号
  3. k8s部署nginx集群
  4. json 潜逃 结构体_JSON还原为结构体 - osc_t5zhwnvx的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 开源商务智能软件Pentaho
  6. [转载] 基本概念:java中的访问修饰符
  7. 十步让你成为更优秀的程序员
  8. flutter推荐路由器插件:go_router
  9. 解析接口中的JSON数据
  10. cropper左右移动_cropper.js移动端使用
  11. 五个金念什么_四个“金”字读什么?
  12. 棋牌漏洞游戏反汇编译破解修改透视案例分析
  13. 打印服务器的打印机显示端口错误,使用标准 TCP/IP 端口时,2335DN 打印机可能会错误地显示为离线...
  14. 苹果Mac电脑L2TP连接公司内部网络失败解决方案
  15. java语言与java技术
  16. 【Java锁体系】ReadWriteLock读写锁是什么?什么是读写锁
  17. react-rnd靠右显示
  18. Excel测试多个链接的简易方式
  19. matlab里实现AR人脸库2600张人脸图的分类处理
  20. Java策略模式(Strategy)

热门文章

  1. iOS 第三方登录 !
  2. js 兼容event.target
  3. (原)学习ORACLE 视图
  4. php单例型(singleton pattern)
  5. vc/vs开发的应用程序添加dump崩溃日志转
  6. 全局eslint不生效的处理
  7. 20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结
  8. 【数据结构】图的深度优先搜索
  9. 【转】Linux命令之查看文件占用空间大小-du,df
  10. 我是如何实用:before :after