Python | threading05 - 使用有界信号量,实现线程间同步
文章目录
- 一、前言
- 二、ValueError异常
- 2.1、测试有界信号量过多释放是否真的会产生ValueError异常
- 三、生产者-消费者模型
- 3.1、代码
- 3.2、运行的结果
一、前言
上一节学习完信号量,接着继续学习有界信号量。
首先看看python官方对有界信号量的描述:
从官方的描述可以看到,release( )方法过多被调用时,就会产生ValueError异常。
二、ValueError异常
2.1、测试有界信号量过多释放是否真的会产生ValueError异常
我在命令行测试了一下,过多的释放的确会产生ValueError:Semaphore released too many times.
三、生产者-消费者模型
本次的代码目的如下:
- 生成者producer每隔3秒时间同步一次消费者1(customer1)与消费者2(customer2)。
- 消费者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 - 使用有界信号量,实现线程间同步相关推荐
- C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
目录 windows使用CreateEvent.SetEvent.ResetEvent.WaitForSingleObject linux使用sem_init.sem_wait.sem_trywait ...
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- LinuxC高级编程——线程间同步
LinuxC高级编程--线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的. 1. 互斥锁mutex 多个线程同时访问共享数据时可能会冲突.对于多线程的程序,访问冲突的问题是很普遍的,解决的办法 ...
- IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信
文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...
- 线程间同步和通信,event semaphore mailbox
线程间同步和通信,event semaphore mailbox 1. 概述 2. 事件event 3. wait_order() 4. 旗语(semaphore) 5. semaphore::get ...
- 进程间通信 和 线程间同步
以前经常搞混,所以记录下来. 进程间通信主要是指多个进程间的数据交互. 而线程间同步主要指维护多个线程之间数据准确.一致性. 一.进程间通信主要有以下几种方式: 管道(pipe):管道是一种半双工的通 ...
- Python | threading04 - 使用信号量,实现线程间同步
文章目录 一.前言 二.生产者-消费者模型 2.1.代码 2.2.运行的结果 2.3.Semaphore没有设置上限值 一.前言 先说一下信号量与互斥量之间的关系.信号量的一个特殊的应用是互斥锁(互斥 ...
- 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁
一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,cons ...
- python线程同步锁_[python] 线程间同步之Lock RLock
为什么需要同步 同样举之前的例子,两个线程分别对同一个全局变量进行加减,得不到预期结果,代码如下: total = 0 def add(): global total for i in range(1 ...
最新文章
- Windows VMware中Ubuntu与宿主共享文件夹
- K-BERT | 基于知识图谱的语言表示模型
- 使用NSRunloop等待异步任务完成
- 使用hibernate实现树形结构无限级分类
- Spring Boot 2.0.0.M3使用案例,案例配置,常用命令,注解介绍,热部署
- 58.配置tomcat监听80 虚拟主机 日志
- [转载] C#面向对象设计模式纵横谈——7. Adapter适配器模式
- iOS 设计模式之工厂模式
- python文件的路径_如何从目录中给出python文件的路径
- 【图形学概览】几何折叠 Geometric Folding
- tdd(测试驱动开发)的概述
- H264解码过滤花屏视频帧
- 德龙钢铁大脑:更锐的眼,更快的脑
- 数据库如何删除服务器文件,SqlServer数据库同时备份到两台服务器上(并自动删除过期文件)...
- html卡牌游戏代码,查看“宝可梦卡牌游戏DPt系列”的源代码
- CODESYS Automation Server Connector
- Memkind 例程1 调用memkind_malloc()分配内存
- SQL Server 11_编写脚本和批处理
- 汉王科技发布多款AI智能新品,布局服务机器人新赛道
- 过客--三星 s6 edge 照相机出故障了