如果现在需要在多处加锁大于等于2的时候 因为计算机比较笨,当他锁上一把锁的时候又所理一把锁,等他来开锁的时候他不知道用哪把钥匙来开锁,

所以这个时候我们需要把把平常的锁变为迭代锁

eg:

  1. import threading
  2. import time
  3.  
  4. local = threading.RLock()
  5. # 迭代加锁首先生成实例
  6. def run(name):
  7. global num
  8. local.acquire() # 上锁
  9. num += 1
  10. run2(num)
  11. local.release() # 解锁
  12. print(threading.active_count())
  13.  
  14. def run2(num):
  15. local.acquire()
  16. num += 1
  17. run3(num)
  18. local.release()
  19.  
  20. def run3(num):
  21. local.acquire()
  22. num+=1
  23. local.release()
  24.  
  25. num = 0
  26. py_res = []
  27. for i in range(50):
  28. t = threading.Thread(target=run,args=('t%s'%i,))
  29. py_res.append(t)
  30. t.start()
  31.  
  32. for i in py_res:
  33. i.join()
  34.  
  35. print("num : %s"% num)

型号量可以控制同线程的个数,和锁的用法一样

  1. import threading
  2. import time
  3. senm = threading.BoundedSemaphore(5)
  4. def run(num):
  5. senm.acquire() # 上锁
  6. time.sleep(2)
  7. print('run the thread %s' % num)
  8. senm.release() # 解锁
  9.  
  10. for i in range(50):
  11. t = threading.Thread(target=run, args=('%s' % i,))
  12. t.start()
  13. print(threading.active_count())
  14.  
  15. while threading.active_count() != 1:
  16. pass
  17. else:
  18. print('is done')

信号量:event

标志位 :set,设置标志位 clear 设置标志位,wait 等带标志位,is_set 判断是否设置了标志

下面是一个红绿灯的程序,实现红灯停绿灯行

  1. import threading
  2. import time
  3. event = threading.Event()
  4. # red is have flag or no
  5.  
  6. def light():
  7. count = 0
  8. while True:
  9. if count > 5 and count <= 10:
  10. print('red')
  11. event.set()
  12. elif count > 10:
  13. print('green')
  14. event.clear()
  15. count = 0
  16. else:
  17. print('in the else')
  18.  
  19. time.sleep(1)
  20. count += 1
  21. def car(name):
  22. while True:
  23. if event.is_set():
  24. print('the %s is runing...' % name)
  25. time.sleep(1)
  26. else:
  27. print('%s is wait...' % name)
  28. event.wait()
  29.  
  30. t1 = threading.Thread(target=light)
  31. t1.start()
  32. t2 = threading.Thread(target=car, args=('tesla', ))
  33. t2.start()

python之迭代锁与信号量的更多相关文章

  1. Python的互斥锁与信号量

    并发与锁 a. 多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量.条件锁 b. c.互斥锁1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那 ...

  2. Python的并发并行[1] -> 线程[2] -> 锁与信号量

    锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...

  3. python之网络编程--锁、信号量、线程、队列

    一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...

  4. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  5. Python GIL、线程锁、信号量及事件

    GIL是什么? GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编 ...

  6. Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池

    Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...

  7. 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue

    gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...

  8. 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器

    1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...

  9. 并发编程---线程 ;python中各种锁

    一,概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 --车间负责把资源整合到 ...

随机推荐

  1. 【C语言学习笔记系列】C语言编程狼追兔子问题代码解析!

    问题描述 一只兔子躲进了10个环形分布的洞中的一个.狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找:也没有找到,就隔2个洞,到第6个洞去找:以后每次多一个洞去找兔子--这样下去,如果一直找不到 ...

  2. HTML DOM Document的实际应用

    HTML文档中可以使用以下属性和方法: 属性 / 方法 描述 document.activeElement 返回当前获取焦点元素 document.addEventListener() 向文档添加句柄 ...

  3. ThreeJS学习6_几何体相关(BufferGeometry)

    ThreeJS学习6_几何体相关(BufferGeometry) 使用 BufferGeometry 可以有效减少向 GPU 传输几何体相关数据所需的开销 可以自定义顶点位置, 面片索引, 法向量, ...

  4. MVC实现修改数据

    前言 前言 最近没什么好写的,所以写个修改来巩固一下知识 控制器 public ActionResult UpdeteCartsNum(SYS_Carts sYS_Carts) { var list ...

  5. STC 核心板 入门记

    写在开始 STC核心板,它的软件十分全面,想要什么都有,非常适合新手入门. 上一次电赛刚结束,现在反正也啥也不太会,干脆学个这个吧. 顺便写篇博客记录一下. 记录第一次烧写 周四下单,周六到货.中午拿 ...

  6. rsync 守护进程模式搭建 与常见报错

    守护进程模式搭建 1.环境准备 2.安装rsync(做备份的服务器都安装) [root@backup ~]# yum install -y rsync 3.服务端配置 [root@backup ~]# ...

  7. OpenTelemetry架构介绍

    OpenTelemetry: 经得起考验的工具 摘自:https://blog.newrelic.com/product-news/what-is-opentelemetry/ 目录 OpenTele ...

  8. 安装Redis(Windows版本&Linux版本)

    1.版本: Redis官网上有Linux版本,Redis官网:https://redis.io/download GitHub上有Windows版本,地址是:https://github.com/Mi ...

  9. Linux文件操作常用命令

    一.一些文件操作命令. 1.cd /home  进入"home目录" 2.cd ../ 返回上一级目录 3.cd -  返回上次所在的目录 4.pwd 显示工程路径 5.ll 显示 ...

  10. liunx命令的运用

    工作中用到了一些命令,记忆才深刻 1.查看服务器内存:free -h 2.查看服务器磁盘空间:df -h 3.切root用户:sudo su root 输入密码 4.查看liunx服务器下的所有用户: ...