文章目录

  • 一、前言
  • 二、ValueError异常
    • 2.1、测试有界信号量过多释放是否真的会产生ValueError异常
  • 三、生产者-消费者模型
    • 3.1、代码
    • 3.2、运行的结果

一、前言


上一节学习完信号量,接着继续学习有界信号量。
首先看看python官方对有界信号量的描述:

从官方的描述可以看到,release( )方法过多被调用时,就会产生ValueError异常。

二、ValueError异常


2.1、测试有界信号量过多释放是否真的会产生ValueError异常

我在命令行测试了一下,过多的释放的确会产生ValueError:Semaphore released too many times.

三、生产者-消费者模型


本次的代码目的如下:

  1. 生成者producer每隔3秒时间同步一次消费者1(customer1)与消费者2(customer2)。
  2. 消费者1(customer1)与消费者2(customer2)每一次被同步都可以运行两次。

3.1、代码

# python3.9
import time
import threadingse1 = threading.BoundedSemaphore(2)  # se1信号量的初始数量与上限值是2
se2 = threading.BoundedSemaphore(2)  # se2信号量的初始数量与上限值是2# 消费者1线程函数
def customer1():global se1while True:print("customer1进入阻塞态,等待信号量的释放。")se1.acquire()  # 向se1信号量请求一个信号print("customer1请求信号量成功,time:%s" % time.perf_counter())# 消费者2线程函数
def customer2():global se2while True:print("customer2进入阻塞态,等待信号量的释放。")se2.acquire()  # 向se1信号量请求一个信号print("customer2请求信号量成功,time:%s" % time.perf_counter())# 生产者线程函数
def producer():while True:time.sleep(3)  # 休眠3秒钟# 释放se1两个信号se1.release()se1.release()# 释放se2两个信号se2.release()se2.release()print("producer释放完信号量,其他线程将被同步。time:%s" % time.perf_counter())# 主线程函数t1 = threading.Thread(target=producer,name="thread_producer",daemon=True)    # 创建producer子线程t2 = threading.Thread(target=customer1,name="thread_customer1",daemon=True)  # 创建cusotmer1子线程t3 = threading.Thread(target=customer2,name="thread_customer2",daemon=True)  # 创建customer2子线程t1.start()  # 启动producer线程 t2.start()  # 启动customer1线程t3.start()  # 启动customer2线程t1.join()   # 子线程producer是无限循环的线程,所以主线程需要等待它运行结束t2.join()   # 子线程customer1是无限循环的线程,所以主线程需要等待它运行结束t3.join()   # 子线程customer2是无限循环的线程,所以主线程需要等待它运行结束print("主线程运行结束!")if __name__ == "__main__":main()

3.2、运行的结果

跟上一节的运行结果一样。

我个人认为,尽量避免使用信号量而是使用有界信号量,因为有界信号量的信号量被过多释放时会出现警告ValueError。

Python | threading05 - 使用有界信号量,实现线程间同步相关推荐

  1. C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试

    目录 windows使用CreateEvent.SetEvent.ResetEvent.WaitForSingleObject linux使用sem_init.sem_wait.sem_trywait ...

  2. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  3. LinuxC高级编程——线程间同步

    LinuxC高级编程--线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的. 1. 互斥锁mutex 多个线程同时访问共享数据时可能会冲突.对于多线程的程序,访问冲突的问题是很普遍的,解决的办法 ...

  4. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

  5. 线程间同步和通信,event semaphore mailbox

    线程间同步和通信,event semaphore mailbox 1. 概述 2. 事件event 3. wait_order() 4. 旗语(semaphore) 5. semaphore::get ...

  6. 进程间通信 和 线程间同步

    以前经常搞混,所以记录下来. 进程间通信主要是指多个进程间的数据交互. 而线程间同步主要指维护多个线程之间数据准确.一致性. 一.进程间通信主要有以下几种方式: 管道(pipe):管道是一种半双工的通 ...

  7. Python | threading04 - 使用信号量,实现线程间同步

    文章目录 一.前言 二.生产者-消费者模型 2.1.代码 2.2.运行的结果 2.3.Semaphore没有设置上限值 一.前言 先说一下信号量与互斥量之间的关系.信号量的一个特殊的应用是互斥锁(互斥 ...

  8. 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁

    一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,cons ...

  9. python线程同步锁_[python] 线程间同步之Lock RLock

    为什么需要同步 同样举之前的例子,两个线程分别对同一个全局变量进行加减,得不到预期结果,代码如下: total = 0 def add(): global total for i in range(1 ...

最新文章

  1. Windows VMware中Ubuntu与宿主共享文件夹
  2. K-BERT | 基于知识图谱的语言表示模型
  3. 使用NSRunloop等待异步任务完成
  4. 使用hibernate实现树形结构无限级分类
  5. Spring Boot 2.0.0.M3使用案例,案例配置,常用命令,注解介绍,热部署
  6. 58.配置tomcat监听80 虚拟主机 日志
  7. [转载] C#面向对象设计模式纵横谈——7. Adapter适配器模式
  8. iOS 设计模式之工厂模式
  9. python文件的路径_如何从目录中给出python文件的路径
  10. 【图形学概览】几何折叠 Geometric Folding
  11. tdd(测试驱动开发)的概述
  12. H264解码过滤花屏视频帧
  13. 德龙钢铁大脑:更锐的眼,更快的脑
  14. 数据库如何删除服务器文件,SqlServer数据库同时备份到两台服务器上(并自动删除过期文件)...
  15. html卡牌游戏代码,查看“宝可梦卡牌游戏DPt系列”的源代码
  16. CODESYS Automation Server Connector
  17. Memkind 例程1 调用memkind_malloc()分配内存
  18. SQL Server 11_编写脚本和批处理
  19. 汉王科技发布多款AI智能新品,布局服务机器人新赛道
  20. 过客--三星 s6 edge 照相机出故障了

热门文章

  1. 【日常填坑】之ajax请求laravel的api接口
  2. Git 的安装和创建版本库 。
  3. dropdownlist可以多选。类似的例子。。。
  4. WinDbg+Rotor解析WinForm调用堆栈及实现
  5. 为什么大学感觉学编程很难?原因有这三点。
  6. 生产排期混乱、质量问题难定位?这套生产场景方案全解决,附模板
  7. 在深圳呆那么就感觉伤心了有木有?
  8. NanShan作者:风景未变人已变
  9. 对 飞秋 程序设计的一些新想法
  10. 【比较】CWebBrowser2类Navigate方法的一些问题