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

立即学习: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
'''

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode 快速更改编码格式

1、view下的 Cmmand Palette 下的Change file Encoding simplifiled chinese GB2312

iostat

r/s: 每秒读取的请求数。 w/s: 每秒写入的请求数。 Avgqu-sz: 平均I/O队列长度 Await:平均每次设备I/O操作的等待时间(毫秒) Svctm:平均每次设置I/O操作的服务时间(毫秒),Svctm越接近Await则说明等待时间少 %util:表示设备的繁忙程度,80%表示设备设备已经…

学习笔记(29):Python网络编程并发编程-信号量

立即学习:https://edu.csdn.net/course/play/24458/296446?utm_sourceblogtoedu 信号量(了解):也是一把锁semaphore 1. from threading import Thread,Semaphore,currentThread import time#定义信号量(3把锁) sm Semaphore(3)def task()…

Ajax基础2

什么是服务器 网页浏览过程的分析 如何配置自己的服务器程序(AMP) 什么是Ajax 无刷新数据读取 异步,同步 Ajax基础(2) 使用Ajax 基础请求显示txt的文件 字符集编码 缓存,阻止缓存 动态数据,请求js或(json&a…

动态SQL应用(成绩排名)

Code-- 年级排名和班级排名declare sql varchar(4000),nclassid int,nexamid int select sql select nclassid38 select nexamid19select sqlsqlmax(case scoursename when scoursename then descore else 0 end) scoursename,from (select distinct scoursename from t_card_…

《将进酒》——李白

君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意寻尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子…

关于windows上的exe可执行程序在黑色窗口运行时候不能点击屏幕,要不然会暂定程序

关于windows上的exe可执行程序在黑色窗口运行时候不能点击屏幕,要不然会暂定程序 2019-12-3 记录

学习笔记(30):Python网络编程并发编程-Event事件

立即学习:https://edu.csdn.net/course/play/24458/296447?utm_sourceblogtoedu threading.Event事件 1.概念及功能:主要是完成线程之间的通信,将另一个线程的运行状态通知给另一个线程 2.使用场景: 1)客户端运行时等待服务器启…

Java操作ftp,上传,下载,删除操作

使用java commons net包中的api可以方便操作ftp操作。 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;import org.apache.commons.net.ftp.F…

Dynagen0.11+Pemuwrapper入手麻烦二三事——告诉初学者直路

Dynagen在数度难产后终于诞生了0.11版本,这是个里程碑似的版本,他整合了confDynagen和Pemuwrapper,使得我们在搭建复杂安全环境下的拓扑变得更容易和易于调整。confDynagen的具体介绍这里就从略了,我们着重看下Pemuwrapper的问题。…

第五部分 一阶逻辑等值演算与推理

目录 基本等值式 例1 将下面命题用两种形式符号化, 并证明两者等值: 例2 将公式化成等值的不含既有约束出现、又有自由出现 例3 设个体域D{a,b,c}, 消去下述公式中的量词: 例4 求下列公式的前束范式 推理的形式结构 定义5.3 自然推理系统 构造推理证明的实例 例5 在自然推理系…

从易到难,写一个JavaScript加载器之一

先上代码: 1 (function(global) {2 var createScript, insertScript, makeLoadQueue;3 createScript function(src) {4 var script;5 script document.createElement(SCRIPT);6 script.src "" src ".js";7 return script;8 };9…

关于怎么怎么把 unsingned char 数据转换为 Opencv 的Mat类型,并且吧图像显示出来

1、定义 unsignde char* A; 2、定义cv::Mat B(cv::Size(800,500),CV_8U) 3、使用c语言的 memcpy(B.data, A,800*500)//将A指针的数据复制到B中的数据内存,并且给出内存大小 4最后unsignde char 类型数据就会被转化为Mat类型,并且可以显示出…

学习笔记(31):Python网络编程并发编程-定时器

立即学习:https://edu.csdn.net/course/play/24458/296448?utm_sourceblogtoedu 定时器:threading.Timer 1.概念:定时器就是实现过多久去执行什么事情 2.相关函数 1)Timer(self,interval,function,args()) interval:定时的时间 functio…

vs2012 与 win7 不兼容的问题

我用的是win7 64位系统,所以安装位置那里是“C:\Program Files (x86)”,多了个(x86)。 百度搜索到园子里的师兄给的解决办法http://www.cnblogs.com/mumuliang/archive/2013/08/20/3270628.html 装这个补丁: Update for Microsoft Visual Stu…

Scrum方法论(四)

本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/1358371,如需转载请自行联系原作者

atoi(),函数,将字符串转为整形数字

C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数&#xff08;类型为 int 型&#xff09;。 测试用例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {int val;char str[20];strcpy(str, …

学习笔记(32):Python网络编程并发编程-线程queue

立即学习:https://edu.csdn.net/course/play/24458/296449?utm_sourceblogtoedu 线程queue 一&#xff1a;Queue先进先出 1.queue.Queue(n):创建一个最大容量为n的队列 2.queue.Queue(n).put():添加元素 3.queue.Queue(n).get():取元素 4.put()和get(),默认阻塞状态为True&am…

第一天,仔细学习了下:common.inc.php(Discuz6.1.0核心文件)01

<?php /* April 18,2012 discuz二次开发学习 author:xuqin 不能为了完成任务去做一件事&#xff0c;要举一反三&#xff0c;融会贯通的去学习。 */ error_reporting(0); /* * error_reporting(0); //抑制所有的出错信息 * error_reporting(E_ALL);//显示所有的出错信息 …

acdream 1023 xor按位思考

思路&#xff1a;记答案为ans&#xff0c;统计出数列A和B在某二进制某一位上有多少个1&#xff0c;如果个数相同&#xff0c;则ans那一位上为0&#xff08;因为题目要求最小的满足条件的值&#xff09;&#xff0c;如果不一样&#xff08;则需要考虑那一位上异或个1&#xff09…