”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 生产者/消费者

生产者/消费者

发布于2024-07-31
浏览:561

定义

我们考虑两个流程,分别称为“生产者”和“消费者”。生产者是一个循环过程,每次循环都会产生一定部分的信息,这些信息必须由消费者处理。消费者也是一个循环过程,每次它经历它的周期时,它都可以处理下一条信息,因为它是由生产者产生的。计算过程给出了一个简单的例子,该计算过程生成由穿孔卡打孔的穿孔卡的“信息部分”图像,穿孔卡扮演消费者的角色。[1]

Producer/Consumer (Produtor/Consumidor)

解释

生产者创建项目并将其存储在数据结构中,而消费者从该结构中删除项目并处理它们。

如果消费大于生产,则缓冲区(数据结构)清空,消费者没有什么可消费的
如果消耗量小于生产量,则缓冲区已满,生产者无法添加更多项目。这是一个经典问题,称为有限缓冲区

问题的情境化

假设我们有一个生产者在缓冲区中发布一封电子邮件,以及一个消费者使用缓冲区中的电子邮件并显示一条消息,说明已使用所提供的电子邮件的新访问密码发送了一封电子邮件。 ]

去实施

包主 进口 ( “FMMT” “你” “strcon” “同步” “团队” ) 类型缓冲区结构 { 项目[]字符串 mu同步互斥体 } func (buff *buffer) add(项目字符串) { buff.mu.Lock() 延迟 buff.mu.Unlock() if len(buff.items) package main import ( "fmt" "os" "strconv" "sync" "time" ) type buffer struct { items []string mu sync.Mutex } func (buff *buffer) add(item string) { buff.mu.Lock() defer buff.mu.Unlock() if len(buff.items) 解释实施

    首先,我们创建一个名为
  • buffer 的结构,其中包含一个名为 items 的字符串数组和一个名为 mu 的类似互斥体的控制机制,用于管理并发访问。
  • 我们有两个函数:一个称为 add,它基本上将一个项目添加到缓冲区中,只要有可用空间,因为缓冲区容量只有 5 个项目;另一个 get 调用,如果缓冲区中有项目,则返回第一个元素并从缓冲区中删除该元素。
  • Producer 基本上从循环中获取索引,并将其连接成一个名为 str 的字符串,其中包含索引和虚拟电子邮件域,并将其添加到缓冲区。添加了时间间隔来模拟延迟。
  • 消费者从缓冲区请求一个项目(如果它至少有一个项目)。然后,消费者在屏幕上显示一条消息,通知已发送一封电子邮件,其中包含缓冲区中发布的项目的新访问密码。

代码链接: https://github.com/jcelsocosta/race_condition/blob/main/ Producerconsumer/buffer/ Producerconsumer.go

参考

    https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123.html#4.1。通用信号量的典型用途。
参考书目

https://www.cin.ufpe.br/~cagf/if677/2015-2/slides/08_Concorrencia (Jorge).pdf

版本声明 本文转载于:https://dev.to/celso/producerconsumer-produtorconsumidor-1jok?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-25
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-03-25
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-03-25
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-03-25
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-03-25
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-03-25
  • 在解散期间,如何处理动态JSON字段类型?
    在解散期间,如何处理动态JSON字段类型?
    在GO 要解决此问题,可以采用一种使用接口类型的类型 - 动态方法。考虑以下JSON数据: { “ mykey”:[[ {obj1}, {obj2} 这是给出的 } [2 mykey []接口{}`json:“ mykey”` } mykey slice元素将被...
    编程 发布于2025-03-25
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-03-25
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-03-25
  • 克服NeoApps.ai的REST API挑战
    克服NeoApps.ai的REST API挑战
    使用标准实践开发REST API是至关重要的,但通常具有挑战性。从确保一致的设计和确保身份验证到管理可扩展性和错误处理,开发人员面临需要时间和专业知识的障碍。 REST API开发中的共同挑战 一致的标准:跨端点保持统一性。 :在不断发展的API时管理向后兼容。 身份验证和安全性:安...
    编程 发布于2025-03-25
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-03-25
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-03-25
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-03-25
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-03-25
  • 程序终止时泄漏的内存会释放吗?
    程序终止时泄漏的内存会释放吗?
    embore泄漏和程序终端通常在编程中,必须根据需要分配和释放资源。无法正确处理资源可能会导致内存泄漏,该程序不再引用分配的内存,而是被占用。 当程序终止时,此泄漏的内存是否已释放, 答案:对于最常见的操作系统,例如Windows,Linux和Solaris,此行为是正确的。但是,值得注意的是,...
    编程 发布于2025-03-25

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3