递归锁和死锁(Python)
一、递归锁
# Lock :互斥锁 效率高
# RLock :递归(recursion)锁 效率相对低 在同一个线程中可以被acquire多次,如果想要释放锁,acquire多少次就要release多少次 from threading import RLock def func(i,rlock):
rlock .acquire()
rlock .acquire()
print(i,': start')
rlock .release()
rlock .release()
print(i, ': end') rlock = RLock ()
for i in range(5):
Thread(target=func,args=(i,rlock)).start()
二、死锁
# import time
# from threading import Thread,Lock,RLock
# fork_lock = noodle_lock = RLock()
# # fork_lock = RLock()
#
# def eat(name):
# noodle_lock.acquire()
# print(name,'抢到面了')
# fork_lock.acquire()
# print(name, '抢到叉子了')
# print(name,'吃面')
# time.sleep(0.1)
# fork_lock.release()
# print(name, '放下叉子了')
# noodle_lock.release()
# print(name, '放下面了')
#
# def eat2(name):
# fork_lock.acquire()
# print(name, '抢到叉子了')
# noodle_lock.acquire()
# print(name,'抢到面了')
# print(name,'吃面')
# noodle_lock.release()
# print(name, '放下面了')
# fork_lock.release()
# print(name, '放下叉子了')
#
# Thread(target=eat,args=('alex',)).start()
# Thread(target=eat2,args=('wusir',)).start()
# Thread(target=eat,args=('taibai',)).start()
# Thread(target=eat2,args=('大壮',)).start() import time
from threading import Thread,Lock,RLock
fork_noodle_lock = Lock()
# fork_lock = RLock() def eat(name):
fork_noodle_lock.acquire()
print(name,'抢到面了')
print(name, '抢到叉子了')
print(name,'吃面')
time.sleep(0.1)
fork_noodle_lock.release()
print(name, '放下叉子了')
print(name, '放下面了') def eat2(name):
fork_noodle_lock.acquire()
print(name, '抢到叉子了')
print(name,'抢到面了')
print(name,'吃面')
fork_noodle_lock.release()
print(name, '放下面了')
print(name, '放下叉子了') Thread(target=eat,args=('a',)).start()
Thread(target=eat2,args=('b',)).start()
Thread(target=eat,args=('c',)).start()
Thread(target=eat2,args=('d',)).start() #
# 1:死锁现象是怎么产生的?
# 多把(互斥/递归)锁 并且在多个线程中 交叉使用
# fork_lock.acquire()
# noodle_lock.acquire()
#
# fork_lock.release()
# noodle_lock.release()
# 2:如果是互斥锁,出现了死锁现象,最快速的解决方案把所有的互斥锁都改成一把递归锁,但是程序的效率会降低的
# 3:递归锁 效率低 但是解决死锁现象有奇效
# 4:互斥锁 效率高 但是多把锁容易出现死锁现象
# 5:一把互斥锁就够了
递归锁和死锁(Python)的更多相关文章
- python线程死锁与递归锁
死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待 ...
- python开发线程:死锁和递归锁&信号量&定时器&线程queue&事件evevt
一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...
- python并发编程之多线程2---(死锁与递归锁,信号量等)
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...
- python并发编程之多线程2死锁与递归锁,信号量等
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 这些永远在互相等待的进程称为死锁进程 如下就是死锁 ...
- Python 36 死锁现象和递归锁、信号量、Event事件、线程queue
一:死锁现象和递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远 ...
- Python之路(第四十四篇)线程同步锁、死锁、递归锁、信号量
在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock ...
- python并发编程之线程(二):死锁和递归锁&信号量&定时器&线程queue&事件evevt
一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...
- python 并发编程 多线程 死锁现象与递归锁
一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等 ...
- Python之网路编程之死锁,递归锁,信号量,Event事件,线程Queue
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...
- python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)
什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: 一 from threading import Thread ...
随机推荐
- Three.js 入门
Demo代码地址: https://gitee.com/s0611163/three.js-demo Three.js Three.js下载 从GitHub上下载一个Release版本,https:/ ...
- Function--jdk8用法
Lambda表达式.首先是参数部分,接着是->,可以视为产出,->之后的内容都是方法体. 当只有一个参数时,可以不需要括号(): 正常情况使用()包裹参数,为了保持一致性,也可以使用括号( ...
- win10系统怎么修改host文件
1.先根据下面路径找到host文件 C:\Windows\System32\drivers\etc 2.把HOST文件复制一份出来 3.修改完成后,直接替换就可以
- distributor和gateway联合实现出中继的负载均衡+故障转移
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在之前的文章,我们介绍过distributor模块实现多线路分发的配置方法,但是当线路发生故障时,distributor并不会自动跳 ...
- idea安装并使用maven依赖分析插件:Maven Helper
本文为博主原创,转载请注明出处: 在maven工程中,经常会查看maven的依赖树,在没使用该插件时,需要maven dependency:tree命令进行查看依赖树, 通过maven helper ...
- spring启动流程 (1) 流程概览
本文将通过阅读AnnotationConfigApplicationContext源码,分析Spring启动流程. 创建AnnotationConfigApplicationContext Annot ...
- 使用Spring Data JPA实现审计功能,记录创建人、创建时间、最后修改时间和最后修改人
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- oceanbase部署维护命令学习
oceanbase部署维护命令学习 背景 之前学习过TIDB数据库, 最近又准备学习一下Oceanbase数据库 发现其实两者还是比较相似的. 比较大的区别在于. TiDB是完全开源的, 并且比较明确 ...
- [转帖]Nginx 保留 Client 真实 IP
https://lqingcloud.cn/post/nginx-01/#:~:text=%E5%9C%A8%20Nginx%20%E4%B8%AD%E5%8F%AF%E4%BB%A5%E9%80%9 ...
- [粘贴]关于preparedStatement
作者:wuxinliulei链接:https://www.zhihu.com/question/37043270/answer/83914933来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...