锁
时间:2019-12-13
本文章向大家介绍锁,主要包括锁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
死锁现象与递归锁
死锁:
是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们都将无法推进下去,此时系统处于死锁状态或系统产生了死锁,这些永远在等待的进程称为死锁进程
死锁------------------- from threading import Thread,Lock,RLock import time mutexA = Lock() mutexB = Lock() class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('\033[33m%s 拿到A锁 '%self.name) mutexB.acquire() print('\033[45%s 拿到B锁 '%self.name) mutexB.release() mutexA.release() def f2(self): mutexB.acquire() print('\033[33%s 拿到B锁 ' % self.name) time.sleep(1) #睡一秒就是为了保证A锁已经被别人那到了 mutexA.acquire() print('\033[45m%s 拿到B锁 ' % self.name) mutexA.release() mutexB.release() if __name__ == '__main__': for i in range(10): t = MyThread() t.start() #一开启就会去调用run方法 死锁现象
递归锁
解决死锁现象的方法:就是递归锁
同一把锁,引用一次计数加一,释放一次计数减一,只要计数不为零,其他线程或进程就抢不到,解决死锁问题
递归锁:在python中,为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock
这个RLock内部维持着一个Lock和一个counter变量,counter记录了acquire的次数,从而使资源可以被多次require
直到一个线程上所有的acquire都被release,其他的线程才能获得资源,
# 2.解决死锁的方法--------------递归锁 from threading import Thread,Lock,RLock import time mutexB = mutexA = RLock() class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('\033[33m%s 拿到A锁 '%self.name) mutexB.acquire() print('\033[45%s 拿到B锁 '%self.name) mutexB.release() mutexA.release() def f2(self): mutexB.acquire() print('\033[33%s 拿到B锁 ' % self.name) time.sleep(1) #睡一秒就是为了保证A锁已经被别人拿到了 mutexA.acquire() print('\033[45m%s 拿到B锁 ' % self.name) mutexA.release() mutexB.release() if __name__ == '__main__': for i in range(10): t = MyThread() t.start() #一开启就会去调用run方法
解决死锁
7. 语法
mutexA
=
mutexB=
threading.RLock() ``#一个线程拿到锁,counter加1,该线程内又碰到加锁的情况,
则counter继续加1,这期间所有其他线程都只能等待,等待该线程释放所有锁,即counter递减到0为止
8,互斥锁
9,信号量
Semaphore管理一个内置的计数器,计数来控制并发数量
信号量:信号量是产生一堆的进程|线程,即产生了多个任务去抢那一把锁
from threading import Thread,Semaphore,currentThread import time,random sm = Semaphore(5) #运行的时候有5个人 def task(): sm.acquire() print('\033[42m %s上厕所'%currentThread().getName()) time.sleep(random.randint(1,3)) print('\033[31m %s上完厕所走了'%currentThread().getName()) sm.release() if __name__ == '__main__': for i in range10): #开了10个线程 ,这20人都要上厕所 t = Thread(target=task) t.start() Semaphore举例 ##################################### Thread-1上厕所 Thread-2上厕所 Thread-3上厕所 Thread-4上厕所 Thread-5上厕所 Thread-2上完厕所走了 Thread-6上厕所 Thread-4上完厕所走了 Thread-1上完厕所走了 Thread-7上厕所 Thread-3上完厕所走了 Thread-8上厕所 Thread-5上完厕所走了 Thread-9上厕所 Thread-10上厕所 Thread-8上完厕所走了 Thread-10上完厕所走了 Thread-6上完厕所走了 Thread-7上完厕所走了 Thread-9上完厕所走了
原文地址:https://www.cnblogs.com/daviddd/p/12034419.html
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
- Android-Universal-Image-Loader 图片异步加载类库的使用
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
- haproxy反向代理环境部署(http和https代理)
- 网站速度优化模块HttpCompressionModule
- mysql启动后随即关闭问题解决(ibdata1文件损坏导致)
- webvirtmgr-重命名kvm虚拟机的名称
- Lucene 2.0最基本的入门代码
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
- 查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
- 腾讯云平台部总经理陈磊:大数据背后的技术支撑
- DataSet与Xml相互转化
- SqlTransaction事务使用示例
- nginx的web缓存服务环境部署记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法