Python semaphore evevt生产者消费者模型原理解析
作者:flag_HW 发布时间:2021-11-14 12:52:39
标签:Python,semaphore,evevt,生产,消费,模型
线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量
import threading, time, queue
def test(name):
semaphore.acquire() #获取信号量锁
print('my name is %s' %name)
time.sleep(1)
semaphore.release() #释放信号量锁
semaphore = threading.BoundedSemaphore(5) #创建一个信号量同时可以运行3个线程
for i in range(20):
t = threading.Thread(target=test, args=(i,))
t.start()
while threading.active_count() == 1:
print("all run done")
两个或者多个线程需要交互时,且一个进程需要根据另一线程状态执行对应操作时,可以通过event来设置线程状态达到期望的效果,下面是一个红绿灯的例子
event = threading.Event() #实例化一个event
def light():
while True:
print("红灯亮了,请停车")
time.sleep(20) #开始是红灯20s
event.set() #红灯时间到了,设置标志位
print("绿灯亮了,请通行")
time.sleep(30) #持续30s红灯
event.clear() #清空标志位
def car(num):
while True:
if event.is_set():#检测event被设置则执行
print("car %s run"%num)
time.sleep(5)
else:
print("this is red light waiting")
event.wait() #此处会卡主,直到状态被设置才会向下执行
Light = threading.Thread(target=light,)
Light.start()
for i in range(10):
Car = threading.Thread(target=car, args=(i,))
Car.start()
当多个线程需要交互数据可以使用queue来进行数据传递,下面是经典的生产者消费者多线程模型示例,其中包含线程queue的基本使用方法
my_queue = queue.Queue() #实例化一个队列
queue1 = queue.LifoQueue() #后进 先出队列
queue2 = queue.PriorityQueue() #带优先级的队列
def pro():
for i in range(100):
my_queue.put(i) #队列里面放数据
def con():
while my_queue.qsize() > 0: #当队列有数据时候从队列取数据
print("i an a consumer,get num %s"%my_queue.get(timeout=3))
time.sleep(2)
else:
print("my queue is empty")
Pro = threading.Thread(target=pro)
Pro.start()
for j in range(10):
Con = threading.Thread(target=con)
Con.start()
来源:https://www.cnblogs.com/flags-blog/p/12514580.html


猜你喜欢
- 本文实例讲述了Python爬虫之pandas基本安装与使用方法。分享给大家供大家参考,具体如下:一、简介:Python Data Analy
- 今天调试某页面样式,发现chrome下出现问题,但是同样基于webkit引擎的safari没有问题,很是郁闷。于是寻找针对google ch
- 对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟悉的应用为何不工作。有时候,你甚至不知道系统运行,是否跟原始设计一致。在线运行的应用就是
- MySQL-Group-Replication 是mysql-5.7.17版本开发出来的新特性;它在master-slave 之间实现了强一
- 代码如下import wordcloudimport jiebafont = r'C:\Windows\Fonts\simfang.
- UPA2008于2008年10月24日在深圳举行,托哥、绿桔应邀主持了一场圆桌会和一场工作坊,以下是圆桌会议《商业价值与用户价值的平衡》的现
- 目录1、封装1.1 私有属性和私有方法2、继承2.1 方法的重写2.2 在子类方法中调用父类方法2.3 多继承2.4 新式类和经典类3、多态
- 前言如果说写代码最害怕什么,那无疑是Bug。而对于新手来说,刚刚接触编程,在享受写代码的成就感时,往往也会被各式各样的Bug弄得晕头转向。今
- 前言使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的
- 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQ
- 本文实例讲述了Python实现的直接插入排序算法。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-'
- 关于本地缓存1.wx.setStorage(wx.setStorageSync)、wx.getStorage(wx.getStorageSy
- 触发器:触发器的使用场景以及相应版本:触发器可以使用的MySQL版本:版本:MySQL5以上使用场景例子:每当增加一个顾客到某个数据库表时,
- 前言:前面我们提到了Python数据类型中的内置数值类型与字符串类型。今天学习一下Python的序列数据类型,要知道的是在Python中没有
- 不敢说得太明显太仔细,反正你懂的。有两种方法,一种是搭建本地授权服务器,另一种是直接替换核心文件,修改对应的注册码。先说第一种。 下载Int
- 为了保护系统或数据安全,我们需要最佳随机密码。这里使用unix系统定义的文件设备/dev/random,从中获取随机数生成器的种子。需求说明
- 上一章节我们学习了基础的定义 PPT 的方法以及每一页中的样式,这节课我们将真正的在 PPT 中添加内容,学习一下 pptx 的段落的使用。
- 深度学习中,模型训练一般都需要很长的时间,由于很多原因,导致模型中断训练,下面介绍继续断点训练的方法。方法一:载入模型时,不必指定迭代次数,
- 1.数据采集和标记先采集数据,再对数据进行标记。其中采集数据要就有代表性,以确保最终训练出来模型的准确性。2.特征选择选择特征的直观方法:直
- 手痒痒系列之简单的放大镜写了个放大镜功能,可以设置显示的宽高width,height显示的位置,float ‘left’ 'righ