多线程中的生产者消费者模型

多线程系列(十二) -生产者和消费者模型 在 Java 多线程编程中,还有一个非常重要的设计模式,它就是:生产者和消费者模型。 阅读详情

为什么要使用生产者和消费者模式

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

什么是生产者消费者模式

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

下面我以一个例子来说明这个问题:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:Erik Chan
# datetime:2019/1/10 12:50
# software: PyCharm

import threading,time
import queue

#定义一个最大长度为10的队列
q= queue.Queue(maxsize=5)

#生产者
def Producer(name):
    count = 1
    while True:
        q.put("面包%s"%count)
        print("生产了面包", count)
        count += 1
        time.sleep(0.2)


#消费者
def Consumer(name):
    while True:
        print("[%s] 吃了[%s] ..." % (name, q.get()))
        time.sleep(1)


#生产者对象Jack
p = threading.Thread(target=Producer,args=("Jack",))
#消费者对象Mary
p2 = threading.Thread(target=Consumer,args=("Mary",))
#消费者对象Alice
p3 = threading.Thread(target=Consumer,args=("Alice",))

p.start()
p2.start()
p3.start()

以上代码中,p,p2,p3线程并发启动运行,并且p线程生产面包的速度更快,我们可以看到p一遍生产面包,p2,p3边吃面包的情况。

运行截图:

真双口RAM---Quartus与Vivado开发环境区别对比 2、写和写冲突:表示两个端口写使能同时有效且写地址相同,此时需要关断一个写,把两个写端口都需要更新的值处理到一个写端口上面,任何的DP RAM 都不支持写和写冲突。以上述直方图统计使用为例,博主在仿真过程中发现,vivado真双口RAM--B端口读写延迟2个clk;1、读和写冲突:如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读。 阅读详情

相关推荐

网络安全学习路线是怎样的?

为什么要学习安全? 近几年网络安全事件层出不穷,相信大家哪怕没遇到过,但也听过不少了吧。如服务器遭受入侵被黑,用户帐号被盗;被钓鱼、勒索病毒等,这些一旦发生,对企业而言都是不小的打击。因此,网络安全不容忽视,同时随着时代的不断发展,公司对于运维及网络工程师要求也越来越严格。未来越来越吃香的一定是技能方向广的复合型人才。网络安全可以说是一条非常好的发展道路。 今年两会期间,全国政协委员,360集团创始人、董事长周鸿祎提交了关于网络安全行业特殊人才的提案,为广大白帽子人员争取更好...

网安技术分享 8697

1.15 freertos 计数器生产和消费模型

【代码】1.15 freertos 计数器生产和消费模型。

qq_62936323的博客 623

Intel MKL库常用模块的C语言实现

文章目录1. 随机数生成1.1 等概率的01分布 viRngUniform1.2 (复)高斯分布 vsRngGaussian2. 向量-向量运算2.1 向量数乘与加法 cblas_caxpby2.2 向量内积 cblas_cdotu_sub2.3 向量范数 cblas_scnrm23. 矩阵-向量运算3.1 矩阵存储方案3.2 矩阵-向量乘法 cblas_cgemv4. 矩阵-矩阵运算4.1 矩阵...

月半 月半的博客 4651

FreeRTOS第四天

死锁:多个任务或者线程因为争夺同一个共享资源而发生了互相等待的情况,导致程序无法继续运行的情况。队列、信号量、互斥量、事件组 多对多通信任务通知是多对一通信。区别:队列,信号量,互斥量,事件组在使用之前都需要先创建,才能使用,任务通知无需创建即可使用。FreeRTOS中有一种任务通信方式:队列,信号量,互斥量,事件组,任务通知。队列、信号量、互斥量、事件组需要被创建,所以消耗的资源也是比较多。1.总结二进制信号量和计数型信号量的区别,以及他们的使用场景。进制信号量:信号量的数值只有0和1。

tjdufjfj的博客 427

筹码峰五句口诀,看懂主力的秘密动作!(附实战图示)

筹码图的价值在于,它不像K线那样容易造假。主力可以骗线,但骗不了筹码分布。主力在不在;是吸筹还是出货;接下来是变盘还是震荡。这五句口诀可以说是“筹码阅读的入门圣经”:单峰坚挺变盘在即,双峰对垒高抛低吸;上峰不移主力在跑,多峰林立行情不止;下峰不移不离不弃,筹码识庄稳中取利!📌市场从来不是靠猜,而是靠看清。筹码,就是主力最真实的痕迹。如果你想学会提前布局、跟庄不被甩,学会看筹码峰——这一步必须打牢!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1162

Far planner 代码系列(33) 关于real_world_contour和contour_graph

我们知道far planner前部分的流程是这样子的: 对于特定的地图,如下: 我们要从surround_obs_cloud里抽取生成realworld_contour_,如下图所示: 在这时候,每个node的z坐标都是以机器人的高度定的。如图所示: 先去吃饭啦~待会回来在写 ...

博客 762

FreeRTOS笔记(五)信号量semaphore

为此,FreeRTOS引入了信号量(Semaphore)概念,通过信号量的同步机制可以使消费者任务在数据还没到达的时候进入阻塞状态,并让出CPU资源给其他任务。假设一个简单的生产者消费者模型--有两个任务,一个任务是数据的生产者(Producer)任务,一个任务是数据的消费者(Consumer)任务,二进制信号量适用于在数据产生的频率比较低的场合。按照正常的思路,消费者任务和生产者任务会轮流执行,但是如果在消费者任务执行的时候数据还没有产生的话,消费者任务的运行就是无用的,会降低CPU的使用效率。

m0_58575472的博客 542

【图像检测】基于MATLAB的火灾监测系统设计

1 简介 针对传统火灾监测系统对于大空间的室内场合和开阔的室外环境易失效的问题,提出了一种结合火灾火焰特征和烟雾特征来进行判断的数字图像型火灾监测算法.火焰颜色特征是基于RGB颜色模型中的R,G,B三基色分量和它们之间的关系来判断是否有火焰发生,烟雾模型特征是图像灰度化预处理后,基于HIS空间模型提取的,通过计算像素点与基准像素点之间距离D的大小来判断是否有火灾发生.对提出的算法进行MATLAB仿真,并和传统的基于五种算子的边缘检测算法提取火焰烟雾特征进行对比.实验结果表明,提出的火焰特征和烟雾特征提取算

qq_59747472的博客 2797

三种方式实现生产者-消费者模型

前言 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该...

Sicimike的博客 4780

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

862

NPU性能榨取手把手教程:RK3588上YOLOv5s多线程部署与120FPS极限探索

RK3588 YOLOv5s多线程部署优化指南 本教程深入解析RK3588芯片上YOLOv5s模型的高性能多线程部署方案。RK3588作为瑞芯微旗舰AIoT芯片,内置三核NPU(6TOPS算力)和硬件加速器(RGA/VPU),为AI推理提供强大支持。通过线程池技术,我们将视频处理的读取、推理、后处理等环节解耦并行,显著提升系统吞吐量。教程详细介绍了从PyTorch到RKNN格式的模型转换流程、INT8量化方法,以及基于RKNN C++ SDK的YOLOv5推理核心实现,帮助开发者最大化发挥RK3588的AI

LXY_LOVE36的博客 973

多线程——生产者消费者模型

多线程下生产者消费者模式 1.什么是生产者—消费者模型?生产者+消费者+阻塞队列 它可以用来解决: 1.生产与消费速度不匹配的问题; 2.软件开发过程中解耦。 阻塞情况 唤醒情况 1.队列已满,阻塞生产者 1.队列不满,唤醒生产者 2.队列已空,阻塞消费者 2.队列不空,唤醒消费者 2.wait()/notify()实现 注意:阻塞时只能用wait()方法,不能用sleep()方法,因为此时不释放锁。假设队列为空,那么消费者sleep,此时消费者不释放锁,那么生产者拿不到锁就不

m0_38057941的博客 390

self‑improving‑agent 安装与配置指南(OpenClaw)

长期记忆错误反思用户偏好学习持续进化AI → 反思 → 学习 → 改进。

tiantiantbtb的博客 1340

Java多线程中的生产者消费者模型

本文利用Java程序,实现一个多线程中的经典问题:生产者-消费者。 首先定义一个Buffer 类,生产者向这个Buffer里放产品(泛型定义),消费者从这个Buffer里取产品。如果Buffer满了,生产者等待;如果Buffer空了,消费者等待。 在主程序里,把Buffer的大小设置为10,启动了3个生产者,2个消费者,生产者生产一个产品需要1秒,消费者消费一个产品也需要一秒,运行30秒后,主

刘勇的专栏 1072

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

多线程的消费者/生产者模型中的神坑

最近在学习多线程的知识,下面的代码是我练手时写的生产者/消费者模型。两个生产者两个消费者共四个线程。 与教学视频的代码一样,但是却有了不同的结果。 package com.java.main; /** * @author:Htc * @date: 2019/7/1 13:23 * @Description:实现资源类 **/ class Resource{ private...

木偶匹诺曹 520

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

多线程生产者 - 消费者模型中的同步机制研究

本文深入探讨多线程编程中经典的生产者 - 消费者模型,在该模型存在多个生产者线程和多个消费者线程的场景下,利用信号量和互斥锁实现线程间的有效同步。生产者线程负责向有界缓冲区写入数据,消费者线程从缓冲区读取数据。文中详细阐述了设计思路、实现过程,并对同步机制进行了全面分析,旨在确保在缓冲区满时生产者线程阻塞,缓冲区空时消费者线程阻塞,以实现高效、稳定的多线程数据处理。

jarfg35的博客 1123

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

队列——在多线程中的运用:生产者与消费者模型

队列选择的必要性: 1). 理论上多线程执行任务是不能获取返回结果的, 因此需要一个容器来存储产生的数据; 2). 容器该如何选择? list(栈, 队列), tuple(元组是不可变的, 不可使用), set(集合默认会去重, 所以不选择), dict, 选择队列类型存储(FIFO===first input first output) import threading from queue i...

GLH_2236504154的博客 500

Python中的生产者-消费者模型:多进程与多线程的实践

生产者-消费者模型涉及两个主要角色:生产者负责生成数据,消费者负责处理数据。在多线程和多进程环境中,这个模型可以帮助我们有效地管理资源和任务队列。

weixin_43822401的博客 1211

避免虚假唤醒:Java 多线程编程中的生产者-消费者模型优化

在多线程编程中,线程间的通信和协调是关键问题之一。特别是在生产者-消费者模型中,多个线程需要协调工作,共同访问和操作共享资源。Java 提供了wait()和notify()等方法来实现线程间的通信。然而,在使用这些方法时,可能会遇到一个常见问题——虚假唤醒(Spurious Wakeup)。虚假唤醒指的是线程在调用wait()方法后,没有满足唤醒条件的情况下被唤醒。为了避免虚假唤醒,需要使用循环(while)来重新检查等待条件。本文将详细分析如何应对虚假唤醒,并提供一个改进的生产者-消费者模型示例。

Java领域优秀创作者 1945

基于java中的多线程应用原型-生产者和消费者模型的应用实例

文章目录前言一、关键技术二、步骤1.创建共享数据类2.创建一个共享数据控制类3.定义一个生产者类4.定义一个消费者类5.主函数总结 前言 利用线程同步和线程通信实现这样一个过程,有一个煎饼摊,每天只做10个煎饼,卖完才能收摊,并且要保证煎饼摊的煎饼数不能超过3个,如果顾客来的时候煎饼数为0,那么该顾客就要等待煎饼做好才能购买。 一、关键技术 线程同步,线程通信,生产者-消费者模型 二、步骤 1.创建共享数据类 设置一个共享数据类(有点像是利用全局变量来计数,只不过将变量封装在类中) 代码如下(示例): /

weixin_45968855的博客 403

并发协作:多线程中的生产者与消费者模型

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。   实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。 对于此模型,应该明确一下几点: 1、生产者仅仅在仓储未满时候生产,仓满则停止生产。 2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。 3、...

weixin_34037977的博客 129

41 生产者消费者模型

为何要使用生产者消费者模型,这个是用过一个容器解决生产者和消费的强耦合问题。生产者和消费者之间不需要通讯,通过阻塞队列通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列取,阻塞队列相当于缓冲区,平衡了双方的能力,用来解耦的上面超市的例子。消费者需要泡面的话不用去找供货商要货,而是去超市取。如果找供货商,消费者只需要一包,供货商开启生产设备只生产一包,多次这样很浪费效率也不高。

qq_43422358的博客 1559

『Linux』第九讲:Linux多线程详解(四)_ 生产者消费者模型

生产者消费者模型详解

枫叶先生的博客 2051

Day33 生产者消费者模型及仓储模型

本节主要讲解线程安全里的生产者消费者模型及仓储模型,从其相关的概念、实现方式、关键点、相关示例等帮助深刻理解

yjp1240201821的博客 1268
上一篇: Java解析xml文件之增删改查
下一篇: 线程与进程的用法与区别
ErikChan.hk
博客等级 码龄12年 107粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值