Python入门学习笔记13(线程锁与信号量)
锁的作用是在多个线程访问同一个资源时对资源进行保护,防止多线程操作造成结果不解预测
1.互斥锁
import threadingnum = 0mutex = threading.Lock();def cal(i):#上锁mutex.acquire()global numnum += i#解锁mutex.release()lst = []
for i in range(5):t = threading.Thread(target=cal,args=(i,))lst.append(t)t.start()for t in lst:t.join()
print(num)
2.可重入锁
可重入锁是用来解决循环加锁造成的死锁问题。
互斥锁连续上锁两次以上便会陷入死锁状态,如果要使用同一把锁进行多次锁操作,必须使用可重入锁RLock。
RLock中维护了一个Lock对象和一个counter,counter中记录了锁acquire的次数,使得可以对锁进行多次的acquire操作。
只有在所有的acquire被release之后,其他线程才能够获得资源。
#如果使用了Lock便会死锁
# mutex = threading.Lock();
mutex = threading.RLock();num = 0def plus():mutex.acquire()print("plus lock")global numnum += 1mutex.release()print("plus release")def mimus():mutex.acquire()print("mimus lock")global numnum -= 1mutex.release()print("mimus release")def run():mutex.acquire()plus()print("-----------")mimus()mutex.release()for i in range(5):t = threading.Thread(target=run)t.start()
3.信号量
互斥锁同时允许一个线程访问资源,而信号量同时允许一组线程访问资源。
连接池就是信号量的运用。
import threading
import time
#一个最大为5的信号量
semaphore = threading.BoundedSemaphore(5)def func(i):semaphore.acquire()print("member%d访问" %i)time.sleep(i)semaphore.release()for i in range(20):t= threading.Thread(target = func,args = (i,))t.start()
从运行结果可以看出,持续会维持在同时最多只有5个线程可以进行访问,当有信号量release了才会用新的进程递补
转载于:https://www.cnblogs.com/Hexdecimal/p/9407559.html
Python入门学习笔记13(线程锁与信号量)相关推荐
- Python入门学习笔记1-Python基础
Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...
- Python入门学习笔记
1 Python入门教程 2 Hello, world! 3 Python中的数据类型 4 可迭代对象 4.1 tuple和list 4.2 set和dict 4.3 range() 4.4 切片 5 ...
- python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)
第10章 正则表达式(重点)与JSON 初识正则表达式 元字符与普通字符 字符集 概括字符集 数量词 贪婪与非贪婪 匹配0次1次或者无限多次 边界匹配符(^ .$) 组 匹配模式参数 re.sub正则 ...
- 传播学小书童的Python入门学习笔记
5月13日,今天学习到的新知识: 1.python程序的构成 python程序由模块(module)组成,模块由语句组成:模块是一个Python的源文件(xxx.py) 2.删除变量: del 这个变 ...
- Python入门学习笔记(7)
今日学习内容为高级字符串内置函数. 1.eval()函数 --执行一个字符串表达式并返回执行结果 语法格式: eval(expression[,globals[,locals]]) expressio ...
- Python入门学习笔记(6)
在医院关了一周的禁闭,终于出关了,Python学习继续!今日学习字符串的常规操作(fighting!!) 1.1 拼接字符串 用 " + "拼接字符串 字符串和其他类型数据无法直接 ...
- Python入门学习笔记(5)
今日周末安排的学习内容比较简单是元组. 元组和列表结构相似,区别在于元组中的元素不可以单独修改,二列表中的元素可以任意修改. 1.元组的创建和删除 使用赋值运算符创建 num = (1,2,7,9,1 ...
- Python入门学习笔记(4)
今天学习序列和列表. 1.序列 在python中,序列结构主要有列表.元组.集合.字典和字符串.对于这些序列通常会有如下操作: 1.1索引 序列中的每一个元素都有一个编号,称之为索引,是从0开始递增的 ...
- Python入门学习笔记(3)
今日学习语句,在程序设计中的3种基本结构是顺序结构.选择结构和循环结构. 1.顺序结构语句 顺序结构语句就是按照程序语句的自然顺序,从上到下,一次执行每条语句的程序,这是程序中最基础的语句,赋值语句. ...
最新文章
- 2021年春季学期-信号与系统-第十一次作业参考答案-第四小题
- sql 2008数据库日志清理(转)
- pitch android,Pitch Clash
- Linux Shell脚本编程 --sort命令
- c语言 if 多个判断条件执行顺序_C语言之流程控制选择语句
- Rails不用localhost访问的时候很慢
- python:urllib.error.URLError: <urlopen error [Errno 11004] getaddrinfo failed>
- phonegap plugin.xml 示例
- 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载
- hex2000使用方法
- Z3735d android x86,首款搭载Z3735处理器 神秘平板被曝光
- 如何通过“云之讯”平台,完成短信的发送
- mysql 样本容量,样本量大小会影响假设检验的结果(是否显著)吗?
- 无法访问此网站网址为 http://localhost:6000/xxx 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 ERR_UNSAFE_POR
- 如何在Win10下,清空剪贴板
- SQLserver 索引碎片
- 通过URL下载图片并压缩
- 贷后策略量化分析系列【1】
- 《交互设计——以用户体验为中心的设计》读书笔记
- 美国GE通用电气 ABB瑞士德国
热门文章
- 【概念原理】四种SQL事务隔离级别和事务ACID特性
- 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2.service)...
- Python——基础篇
- C++ XML解析之TinyXML篇
- 用C#访问Hotmail -转
- 基于动态用户偏好和服务质量的推荐算法
- centos6.2关于tomcat远程不能访问的问题处理过程
- VS2010配置OpenCV
- LaTeX 使用 bib 管理参考文献时,引用网络资源 URL 导致排版难看的问题
- 【Linux】FrameBuffer操作入门