生产者和消费者

深入分析Kafka生产者和消费者 深入Kafka生产者和消费者Kafka生产者消息发送的流程发送方式生产者属性配置序列化器分区器Kafka消费者消费者群组消费者属性配置消费者基础概念消费者核心概念 Kafka生产者 消息发送的流程 生产者每发送一条消息需要先创建一个ProducerRecord对象,并且需要指定目标主题、消息内容,当然还可以指定消息键和分区。之后就会调用send()方法发送该对象,由于生产者需要与Kafka Broker进行网络传输,必然需要先通过序列化器对消息的键和值对象先进行序列化成字节数组,才能进行传输。 之后,分区 阅读详情

先分析生产者消费者模型描述的问题,然后根据题目给出的具体场景,实现代码。

生产者消费者模型描述:
生产者/消费者问题可以描述为:两个或者更多的进程(线程)共享同一个缓冲区,其中一个或多个进程(线程)作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个进程(线程)作为“消费者”从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:
 生产者和消费者必须互斥的使用缓冲区
 缓冲区空时,消费者不能读取数据
 缓冲区满时,生产者不能添加数据
生产者/消费者模型的优点在于:
1) 解耦:因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码发生变化,都不会对对方产生影响。这样其实就是把生产者和消费者之间的强耦合解开,变成了生产者和缓冲区,消费者和缓冲区之间的弱耦合。
2) 支持并发:如果消费者直接从生产者拿数据,则消费者需要等待生产者生产数据,同样生产者需要等待消费者消费数据。而有了生产者/消费者模型,生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据添加到缓冲区,就可以再去生产下一个数据了。而消费者也是一样的,从缓冲区中读取数据,不需要等待生产者。这样,生产者和消费者就可以并发的执行。
3) 支持忙闲不均:如果消费者直接从生产者这里拿数据,而生产者生产数据很慢,消费者消费数据很快,或者生产者生产数据很多,消费者消费数据很慢。都会造成占用CPU的时间片白白浪费。生产者/消费者模型中,生产者只需要将生产的数据添加到缓冲区,缓冲区满了就不生产了。消费者从缓冲区中读取数据,缓冲区空了就不消费了,使得生产者/消费者的处理能力达到一个动态的平衡。

关键注意点:
1) 假设缓冲区的大小为n(也就是存储单元的个数),它可以被生产者和消费者循环使用。
2) 分别设置两个指针in和out,指向生产者将存放数据的存储单元和消费者将取数据的存储单元,如下图。
3) 生产者不能向满缓冲区写数据,消费者不能在空缓冲区中取数据,即必须对生产者和消费者进行同步。另外,如果不进行同步控制,生产者和消费者可能同时进入缓冲区,甚至可能同时读写一个存储单元,将导致执行结果不确定。

在这里插入图片描述
生产者执行流程:

在这里插入图片描述
消费者执行流程:
在这里插入图片描述

使用信号量同步的过程如下:
在这里插入图片描述

具体问题场景描述:
假设有一个int型数组 ,有n=10 个元素。现在视该数组为缓冲区,创建三个线程作为生产者,随机几秒向缓冲区写入数据,再创建两个线程作为消费者,每隔几秒从缓冲区取数据并打印。 这个过程一直循环。 (随机函数可使用m = rand(), 每操作一次缓存区,适当可以等待若干秒,如使用sleep(),以便以观察结果,不使用也可以。)
请编写代码实现。

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/sem.h>
#include<semaphore.h>

#define SIZE 10

//这里做个循环队列
Typedef struct Array
{
int *data;
int in;
int out;
}Array;

sem_t s;
sem_t n;
sem_t e;

void *Producer1(void *arg)
{
while(1)
{
sem_wait(&e);
sem_wait(&s);

    Array *arr = (Array *)arg;
    (*arr).data[(*arr).in] = rand() % 100;
    (*arr).in = ((*arr).in+1)%SIZE;

    sem_post(&s);
    sem_post(&n);

    sleep(2);
}

}

void *Producer2(void *arg)
{
while(1)
{
sem_wait(&e);
sem_wait(&s);

    Array *arr = (Array *)arg;
    (*arr).data[(*arr).in] = rand() % 100;
    (*arr).in = ((*arr).in+1)%SIZE;

    sem_post(&s);
    sem_post(&n);

    sleep(2);
}

}

void *Producer3(void *arg)
{
while(1)
{
sem_wait(&e);
sem_wait(&s);

    Array *arr = (Array *)arg;
    (*arr).data[(*arr).in] = rand() % 100;
    (*arr).in = ((*arr).in+1)%SIZE;

    sem_post(&s);
    sem_post(&n);

    sleep(2);
}

}

void *Consumer1(void *arg)
{
while(1)
{
sem_wait(&n);
sem_wait(&s);

    Array *arr = (Array *)arg;
    printf("%d ",(*arr).data[(*arr).out]);
    fflush(stdout);
    (*arr).out = ((*arr).out+1)%SIZE;

    sem_post(&s);
    sem_post(&e);

    sleep(2);
}

}

void *Consumer2(void *arg)
{
while(1)
{
sem_wait(&n);
sem_wait(&s);

    Array *arr = (Array *)arg;
    printf("%d ",(*arr).data[(*arr).out]);
    fflush(stdout);
    (*arr).out = ((*arr).out+1)%SIZE;

    sem_post(&s);
    sem_post(&e);

    sleep(2);
}

}

int main()
{
Array arr;
arr.data = (int *)malloc(sizeof(int) * SIZE);
arr.in = arr.out = 0;

pthread_t id[5];
pthread_create(&id[0],NULL,Consumer1,(void *)&arr);
pthread_create(&id[1],NULL,Consumer2,(void *)&arr);
pthread_create(&id[2],NULL,Producer1,(void *)&arr);
pthread_create(&id[3],NULL,Producer2,(void *)&arr);
pthread_create(&id[4],NULL,Producer3,(void *)&arr);

sem_init(&s,0,1);
sem_init(&n,0,0);
sem_init(&e,0,SIZE);

int i = 0;
for(;i < 5 ;i++)
{
    pthread_join(id[i],NULL);
}

sem_destroy(&s);
sem_destroy(&n);
sem_destroy(&e);

free(arr.data);

exit(0);

}
在这里插入图片描述

线程问题生产者消费者流程图 生产者消费者流程图; 生产者消费者流程图。 立即下载

相关推荐

iOS 取证窍门:为什么要先从 Recovery 恢复模式开始?

未记录的 DFU 代表“设备固件升级”。与专为普通用户设计的恢复模式不同,DFU 模式从来都不是为公众设计的。Apple 知识库中的任何地方都没有关于 DFU 的文档。进入 DFU 的方法主要是通过按下、按住和释放按钮的复杂操作序列,并具有精确的时间限制。在多个步骤中的任何一个步骤中,如果时间错误,都会导致重新启动设备,而不是将其切换到 DFU。另外,设备屏幕上也没有 DFU 模式的指示。如果设备成功切换到 DFU,显示屏将保持黑色。即使对于专家来说,进入 DFU 模式也可能很困难。恢复模式是最容易解释的。

2302_82041293的博客 1198

操作系统实验三——生产者-消费者问题

生产者消费者问题 基本原理 在 Linux 操作系统用 C 实现经典同步问题:生产者—消费者,具体要求如下: ① 一个大小为 10 的缓冲区,初始状态为空。 ② 2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复 10 次。 ③ 2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复 10 次。 实验要求 本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造

Luobuda的博客 2万+

1、网站可靠性工程(SRE):原理、实践与转型指南

本文深入探讨了网站可靠性工程(SRE)的核心原理、实践方法以及组织转型策略。从SRE的基本概念如服务水平指标(SLI)、服务水平目标(SLO)和错误预算入手,详细解析了如何通过SRE实现产品开发、运营和管理团队的高效协作。此外,还涵盖了SRE的实施步骤,包括现状评估、组织认同、基础设施建设、事件响应、错误预算政策制定以及组织结构设计等内容。最后,文章展望了SRE的未来发展,强调了服务目录、合规监管及SRE文化建设的重要性,为企业的现代化运营体系转型提供了全面指南。

xk7n92h3p5m的博客 146

【操作系统实验】Linux环境下用进程实现生产者消费者问题——C语言完整代码+详细实验报告

【注意】代码在文末,以下为详细实验报告 【实验目的】   以生产者和消费者问题为例,学习并熟悉Linux下进程通信、同步机制的具体实现方法,主要是了解并掌握信号量机制和共享内存的使用方法,进一步熟悉Linux系统的相关指令的调用。 【实验内容】   使用共享内存和信号量机制来实现生产者和消费者进程间的一对一、一对多和多对多的通信和同步,要求在Linux下实现。 【实验环境】(含主要设计设备、器材、软件等) 【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等) 一、数据结构 1.共享

要像蜗牛一样一步一步往上爬! 2万+

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 134

MyBatis-Plus 实战:敏感字段自动加解密支持模糊查询

本文基于MyBatis-Plus框架提出了一种全链路敏感字段加密方案。通过自定义TypeHandler实现数据入库自动加密和查询自动解密,结合重写LambdaQueryWrapper处理查询条件加密,并适配多种查询方式。方案核心包括:1)AESUtil工具类提供加解密基础能力;2)EncryptTypeHandler实现字段类型转换;3)实体类通过注解配置加密字段。该方案在保证数据安全的同时,对业务代码侵入性小,支持姓名、手机号等敏感信息的全流程加密处理,满足系统开发的安全需求。

蔡定努 596

采用信号量机制实现消费者与生产者的线程同步_经典生产者-消费者问题解析...

1.生产者-消费者问题生产者和消费者问题在现实系统中是很普遍的。例如在一个多媒体系统中,生产者编码视频帧,而消费者消费(解码)视频帧,缓冲区的目的就是减少视频流的抖动。又如在图形用户接口设计中,生产者检测到鼠标和键盘事件,并将其插入到缓冲区中。消费者以某种基于优先级的方式从缓冲区中取出这些事件并显示在屏幕上。生产者和消费者模式共享一个有n个槽位的有限缓冲区。生产者反复地生成新的item,并将它插入...

weixin_39603995的博客 1384

置顶必读(2) | 《YOLOv11实战:从入门到深度优化》目录导航篇(持续更新中)

🏆 本文收录于 《YOLOv11实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现全网各类 YOLOv11 / YOLO系列改进方案与实战案例,目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。 内容坚持 持续更新 + 深度拆解 + 工程落地导向,不仅讲“怎么改”,更讲“为什么这样改、如何真正落地到项目中”。

**My Coding Family** 11万+

经典的进程同步问题-----生产者-消费者问题详解

经典的进程同步问题-----生产者-消费者问题详解一、问题描述二、问题分析三、信号量设置四、记录型信号量解决生产者-消费者问题五、使用AND型信号量解决生产者-消费者问题六、使用信号量集解决生产者-消费者问题七、使用管程解决生产者-消费者问题 进程同步问题是一个非常重要且相当有趣的问题,因而吸引了很多学者对他进行研究。 本文就选取其中较为代表性的生产者-消费者问题来进行学习,以帮助我们更好的理解进程同步的概念及实现方法。 一、问题描述 有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费。

|~~~热爱生活、努力学习的小伙汁~~~| 4592

Pydoll浏览器自动化框架教程

让浏览器自动化回归本质。不再纠缠驱动兼容、不再手动处理验证码、不再因为请求和 UI 分裂而头疼。如果你经常做 Web 自动化、爬虫或者测试,不妨试试 Pydoll。也别忘了给项目点个 ⭐,让作者知道有人喜欢这个工具。👉GitHub 地址。

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

PTP(确时间协议,Precision Time Protocol)时间同步

主时钟定期发送带预估发送时间 t1 的报文(若支持硬件时间戳,实际 t1​ 由后续的Follow_Up报文携带)。所有设备启动后通过协商选举出唯一主时钟(Grandmaster),其余设备自动成为从时钟(Slave)。:从时钟记录接收时间 t2,随后向主时钟发送Delay_Req并记录发送时间 t3​。若使用支持PTP的交换机,可修正报文在交换机内的驻留时间,进一步提升精度。从时钟根据offset调整本地时钟,实现与主时钟同步。动态调整本地时钟,抵消传输延迟和时钟漂移。(或通过BMCA自动当选)。

努力努力努力 1305

图文讲解:聊聊生产者和消费者模式的工作原理

大白话讲解生产者和消费者实际应用和原理

码上代码的博客 1756

图神经网络在金融风险传播分析中的应用

《图神经网络在金融风险传播分析中的应用》 摘要 本文旨在探讨图神经网络(Graph Neural Networks, GNN)在金融风险传播分析中的应用。首先,本文简要介绍了图神经网络的基本概念、发展历史以及其在各类应用场景中的重要性。接着,详细介绍了图神经网络的核心算法,包括图卷积神经网

AI天才研究院 1282

多线程-生产者和消费者模式的四种实现

什么是生产者和消费者模式: 生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此并不直接通信,而是通过阻塞队列进行通信,所以生产者生产完数据后不用等待消费者进行处理,而是直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取数据,阻塞队列就相当于一个缓冲区,平衡生产者和消费者的处理能力。 wait/notify和synchronized配合实现: 生产者...

Fly_Fly_Zhang的博客 7204

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringCloud-生产者和消费者

本文介绍SpringCloud微服务架构中常用的两个基本角色——生产者和消费者。生产者是提供具体服务或功能的模块。它将业务逻辑封装成服务,供其他模块调用。生产者向服务注册中心注册自己提供的服务,使其他模块可以通过服务注册中心发现并调用这些服务。

踏雨歌青春,诗酒趁年华 4006

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++实现生产者和消费者模型

C++实现生产者和消费者模型 C++实现生产者和消费者模型1、实现细节1、单生产者-单消费者模型参考 C++实现生产者和消费者模型 1、实现细节 具体的实现逻辑是构建一个queue来存储生产的数据,queue不满时可以生产,不空时可以消费。 对于这个队列,采用阻塞队列的实现思路。 先实现构造函数,初始化一个unique_lock供condition_variable使用。 如何在类里面使用unique_lock等需要初始化,并且初始化会加锁的对象。这要研究下。我的理解是构造列表初始化,然后函数体里unl

JMW1407的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kafka的生产者和消费者模型

生产者是消息的生产者,它将消息发布到Kafka的主题(Topic)中。

2402_85246552的博客 1229

Java中生产者和消费者总结

生产者和消费者问题是线程模型中的经典问题,生产者和消费者在同一时间段共用同一个存储空间,这个存储空间是一个缓冲区的仓库,生产者可以将产品放入仓库,消费者可以从仓库中取出产品。 ...

Joseph的博客 3773

python 生产者和消费者模式_Python爬虫:生产者和消费者模式

认识生产者和消费者模式生产者和消费者是多线程中很常见的一个问题。产生数据的模块,我们称之为生产者,而处理数据的模块,就称为消费者。但是单单只有生产者和消费者显然还是不够的,一般来说,我们还有一个缓冲区,抽象出来的流程如下图所示。将这个过程以实际例子来说明:假如我们是一个生产辣条的厂家,我们生产出来的辣条肯定是一箱一箱地放在仓库里面,然后卖出去给消费者。【不再考虑经销商环节】1.我们把一箱一箱的辣条...

weixin_39664696的博客 315

Java中生产者和消费者的使用

???? 作者:知识浅谈,优快云签约讲师,优快云博客专家,华为云云享专家,阿里云专家博主 ???? 擅长领域:全栈工程师、爬虫、ACM算法 ???? 公众号: 知识浅谈 ????Java中生产者和消费者的使用????????前言????测试案例????总结 ????前言 在Java中,生产者和消费者模式是一种非常经典的并发设计模式,它主要用于解决生产者线程和消费...

weixin_37005062的博客 93

生产者消费者和仓储模型案例

产品类 - Cake(brand、price、datetime) 仓库类 - Store(maxCapacity、curCapacity、list) 生产者线程 - Producer 消费者线程 - Consumer 注意:先生产的先卖出 -- 队列模式。1.多个线程(生产者线程、消费者线程)操作同一个资源(产品类的对象) 2.多个产品之间来回切换(华为 <--> 小米) null -- 0.0 华为 -- 0.0 小米 -- 3999 华为 -- 1999 脏数据的解决思路:加锁 3.生产一个消费一个。

m0_68761186的博客 1674

【Linux】生产者和消费者问题

aaaa

Scenlyf的博客 1845

Kafka 生产者和消费者实例

基于命令行使用Kafka 类似scala,mysql等,命令行是初学者操作Kafka的基本方式,kafka的模式是生产者消费者模式,他们之间通讯是通过,一个公共频道完成。指定消费者组ID,在同一时刻同一消费组中只有一个线程可以去消费一个分区数据,不同的消费组可以去消费同一个分区的数据。(查看KafkaConsumerTest的运行框)由以下图可以看出生产者生产消息。在工程里面的pom.xml文件添加Kafka依赖。

m0_57781407的博客 4387

例说生产者和消费者模型

什么是生产者和消费者模型什么是生产者消费者模型?生产者和消费是操作系统中一种重要的模型,它描述的是一种等待和通知的机制,如下图。 生产者和消费者模型必须具有的条件用一句话概括,生产者消费者模型必须具有的条件是三种关系,两类角色,一类交易场所。 一类交易场所:交易场所指的是生产者和消费者之间进行数据交换的仓库,这块仓库相当于一个缓冲区,生产者负责把数据放入到缓冲区中,消费者负责把缓冲区中的数据

leap的博客 6926

Kafka的生产者和消费者机制

当Producer的acks设置为1或-1时,Producer每次发送消息都是需要获取Broker端返回的RecordMetadate的。这个过程就需要两次跨网络请求。如果要保证消息安全,那么对于每个消息,这两次网络请求就必须要求是幂等的。但是,网络是不靠谱的,在高并发场景下,往往没办法保证这两个请求是幂等的。Producer发送消息的过程中,如果第一步请求成功了, 但是第二步却没有返回。这时,Producer就会认为消息发送失败了。那么Producer必然会发起重试。

m0_45164511的博客 2587
上一篇: 内存划分
下一篇: 串匹配算法.BF算法
恩嗯
博客等级 码龄8年 47粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值