锁的作用是在多个线程访问同一个资源时对资源进行保护,防止多线程操作造成结果不解预测

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(线程锁与信号量)相关推荐

  1. Python入门学习笔记1-Python基础

    Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...

  2. Python入门学习笔记

    1 Python入门教程 2 Hello, world! 3 Python中的数据类型 4 可迭代对象 4.1 tuple和list 4.2 set和dict 4.3 range() 4.4 切片 5 ...

  3. python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)

    第10章 正则表达式(重点)与JSON 初识正则表达式 元字符与普通字符 字符集 概括字符集 数量词 贪婪与非贪婪 匹配0次1次或者无限多次 边界匹配符(^ .$) 组 匹配模式参数 re.sub正则 ...

  4. 传播学小书童的Python入门学习笔记

    5月13日,今天学习到的新知识: 1.python程序的构成 python程序由模块(module)组成,模块由语句组成:模块是一个Python的源文件(xxx.py) 2.删除变量: del 这个变 ...

  5. Python入门学习笔记(7)

    今日学习内容为高级字符串内置函数. 1.eval()函数 --执行一个字符串表达式并返回执行结果 语法格式: eval(expression[,globals[,locals]]) expressio ...

  6. Python入门学习笔记(6)

    在医院关了一周的禁闭,终于出关了,Python学习继续!今日学习字符串的常规操作(fighting!!) 1.1 拼接字符串 用 " + "拼接字符串 字符串和其他类型数据无法直接 ...

  7. Python入门学习笔记(5)

    今日周末安排的学习内容比较简单是元组. 元组和列表结构相似,区别在于元组中的元素不可以单独修改,二列表中的元素可以任意修改. 1.元组的创建和删除 使用赋值运算符创建 num = (1,2,7,9,1 ...

  8. Python入门学习笔记(4)

    今天学习序列和列表. 1.序列 在python中,序列结构主要有列表.元组.集合.字典和字符串.对于这些序列通常会有如下操作: 1.1索引 序列中的每一个元素都有一个编号,称之为索引,是从0开始递增的 ...

  9. Python入门学习笔记(3)

    今日学习语句,在程序设计中的3种基本结构是顺序结构.选择结构和循环结构. 1.顺序结构语句 顺序结构语句就是按照程序语句的自然顺序,从上到下,一次执行每条语句的程序,这是程序中最基础的语句,赋值语句. ...

最新文章

  1. 2021年春季学期-信号与系统-第十一次作业参考答案-第四小题
  2. sql 2008数据库日志清理(转)
  3. pitch android,Pitch Clash
  4. Linux Shell脚本编程 --sort命令
  5. c语言 if 多个判断条件执行顺序_C语言之流程控制选择语句
  6. Rails不用localhost访问的时候很慢
  7. python:urllib.error.URLError: <urlopen error [Errno 11004] getaddrinfo failed>
  8. phonegap plugin.xml 示例
  9. 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载
  10. hex2000使用方法
  11. Z3735d android x86,首款搭载Z3735处理器 神秘平板被曝光
  12. 如何通过“云之讯”平台,完成短信的发送
  13. mysql 样本容量,样本量大小会影响假设检验的结果(是否显著)吗?
  14. 无法访问此网站网址为 http://localhost:6000/xxx 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 ERR_UNSAFE_POR
  15. 如何在Win10下,清空剪贴板
  16. SQLserver 索引碎片
  17. 通过URL下载图片并压缩
  18. 贷后策略量化分析系列【1】
  19. 《交互设计——以用户体验为中心的设计》读书笔记
  20. 美国GE通用电气 ABB瑞士德国

热门文章

  1. 【概念原理】四种SQL事务隔离级别和事务ACID特性
  2. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2.service)...
  3. Python——基础篇
  4. C++ XML解析之TinyXML篇
  5. 用C#访问Hotmail -转
  6. 基于动态用户偏好和服务质量的推荐算法
  7. centos6.2关于tomcat远程不能访问的问题处理过程
  8. VS2010配置OpenCV
  9. LaTeX 使用 bib 管理参考文献时,引用网络资源 URL 导致排版难看的问题
  10. 【Linux】FrameBuffer操作入门