当前位置: 首页 > news >正文

golang实现生产者消费者模式

在Go语言中,生产者消费者模式可以通过使用Goroutines和Channels来实现。Goroutines允许并发执行,而Channels则用于在生产者和消费者之间安全地传递数据。
生产者消费者模式的基本思路
生产者:负责生成数据并将其放入一个共享的缓冲区(Channel)。
消费者:从共享的缓冲区中取出数据并进行处理。
同步:使用Channel来同步生产者和消费者之间的操作,确保数据的安全传递。

建立一个channel

package outimport "fmt"type Out struct {data chan interface{}
}var out *Outfunc NewOut() *Out {if out == nil {out = &Out{data: make(chan interface{}, 65535),}}return out
}
func Println(i interface{}) {out.data <- i
}
func (o *Out) OutPut() {//for i := range o.data {//	fmt.Println(i)//	fmt.Println("out put")//}//fmt.Println("结束")for {select {case i := <-o.data:fmt.Println(i)}}
}

一对一

package one_oneimport ("producer-consumer/out""sync"
)type Task struct {ID int64
}func (t *Task) run() {out.Println(t.ID)
}var taskCh = make(chan Task, 10)const taskNum int64 = 10000func producer(wo chan<- Task) {var i int64for i = 1; i <= taskNum; i++ {t := Task{ID: i,}wo <- t}close(wo)
}
func consumer(ro <-chan Task) {for t := range ro {if t.ID != 0 {t.run()}}
}
func Exec() {wg := &sync.WaitGroup{}wg.Add(2)go func(wg *sync.WaitGroup) {defer wg.Done()producer(taskCh)}(wg)go func(wg *sync.WaitGroup) {defer wg.Done()consumer(taskCh)}(wg)wg.Wait()out.Println("执行成功")
}

一对多

package one_manyimport ("producer-consumer/out""sync"
)type Task struct {ID int64
}func (t *Task) run() {out.Println(t.ID)
}var taskCh = make(chan Task, 10)const taskNum int64 = 10000func producer(wo chan<- Task) {var i int64for i = 1; i <= taskNum; i++ {t := Task{ID: i,}wo <- t}close(wo)
}
func consumer(ro <-chan Task) {for t := range ro {if t.ID != 0 {t.run()}}
}
func Exec() {wg := &sync.WaitGroup{}wg.Add(1)go func(wg *sync.WaitGroup) {defer wg.Done()producer(taskCh)}(wg)var i int64for i = 0; i < taskNum; i++ {if i%100 == 0 {wg.Add(1)go func(wg *sync.WaitGroup) {defer wg.Done()consumer(taskCh)}(wg)}}wg.Wait()out.Println("执行成功")
}

多对一

package many_oneimport ("producer-consumer/out""sync"
)type Task struct {ID int64
}func (t *Task) run() {out.Println(t.ID)
}var taskCh = make(chan Task, 10)const taskNum int64 = 10000
const nums int64 = 100func producer(wo chan<- Task, startNum int64, nums int64) {var i int64for i = startNum; i < taskNum+nums; i++ {t := Task{ID: i,}wo <- t}
}
func consumer(ro <-chan Task) {for t := range ro {if t.ID != 0 {t.run()}}
}
func Exec() {wg := &sync.WaitGroup{}pwg := &sync.WaitGroup{}var i int64for i = 0; i < taskNum; i += nums {if i >= taskNum {break}wg.Add(1)pwg.Add(1)go func(i int64) {defer wg.Done()defer pwg.Done()producer(taskCh, i, nums)}(i)}wg.Add(1)go func() {defer wg.Done()consumer(taskCh)}()pwg.Wait()go close(taskCh)wg.Wait()out.Println("执行成功")
}

多对多

package many_manyimport ("fmt""producer-consumer/out""time"
)type Task struct {ID int64
}func (t *Task) run() {out.Println(t.ID)
}var taskCh = make(chan Task, 10)
var done = make(chan struct{})const taskNum int64 = 10000func producer(wo chan<- Task, done chan struct{}) {var i int64for {if i >= taskNum {i = 0}i++t := Task{ID: i,}select {case wo <- t:case <-done:out.Println("生产者退出")return}}
}
func consumer(ro <-chan Task, done chan struct{}) {for {select {case t := <-ro:if t.ID != 0 {t.run()}case <-done:for t := range ro {if t.ID != 0 {t.run()}}out.Println("消费者退出")return}}
}
func Exec() {go producer(taskCh, done)go producer(taskCh, done)go producer(taskCh, done)go producer(taskCh, done)go producer(taskCh, done)go producer(taskCh, done)go consumer(taskCh, done)go consumer(taskCh, done)time.Sleep(time.Second * 5)close(done)close(taskCh)time.Sleep(time.Second * 5)fmt.Println(len(taskCh))
}

主程序入口

package mainfunc main() {//o := out.NewOut()//go o.OutPut()//one_one.Exec()//one_many.Exec()//many_one.Exec()//many_many.Exec()//sig := make(chan os.Signal)//signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)//<-sig
}

相关文章:

golang实现生产者消费者模式

在Go语言中&#xff0c;生产者消费者模式可以通过使用Goroutines和Channels来实现。Goroutines允许并发执行&#xff0c;而Channels则用于在生产者和消费者之间安全地传递数据。 生产者消费者模式的基本思路 生产者&#xff1a;负责生成数据并将其放入一个共享的缓冲区&#xf…...

自动化测试-Pytest测试

目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest‌是一个非常流行的Python测试框架&#xff0c;它支持简单的单元测试和复杂的功能测试&#xff0c;具有易于上手、功…...

Ingress-Nginx Annotations 指南:配置要点全方面解读(下)

文章目录 1.HTTP2 Push Preload2.Server Alias3.Server snippet4.Client Body Buffer Size5.External Authentication6.Global External Authentication7.Rate Limiting8.Global Rate Limiting9.Permanent Redirect10.Permanent Redirect Code11.Temporal Redirect12.SSL Passt…...

【QED】等式构造

文章目录 题目题目描述输入输出格式数据范围测试样例 思路代码复杂度分析时间复杂度空间复杂度 题目 题目链接&#x1f517; 题目描述 有关 「上述等式为何正确」 的问题解决了&#xff0c;然而 「如何构造出上述那种让人啼笑皆非的正确等式」 成为了一个新的问题。 我们认…...

Kafka数据迁移全解析:同集群和跨集群

文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景&#xff0c;分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景&#xff1a; broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践&#xff1a; 将需要新添加…...

Debian安装配置RocketMQ

安装配置 本次安装在/tools/rocket目录下 下载 wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip 解压缩 unzip rocketmq-all-5.3.1-bin-release.zip 如果出现以下报错 -bash: unzip: command not found可安装unzip工具后执…...

vue之axios基本使用

文章目录 1. axios 网络请求库2. axiosvue 1. axios 网络请求库 <body> <input type"button" value"get请求" class"get"> <input type"button" value"post请求" class"post"> <!-- 官网提供…...

三只脚的电感是什么东西?

最近在做加湿器&#xff0c;把水雾化的陶瓷片需要有专门的驱动电路。 我参考了某宝卖家的驱动板以及网上的开源项目&#xff0c;发现了驱动电路的核心就是一个三脚电感。 在此之前我都没注意过这玩意&#xff0c;三脚电感不也还是电感嘛&#xff1f; 今天我们就来看看三脚电…...

【数据库学习笔记】SQL触发器(例题+代码)

数据库SQL 1、触发器概念 &#xff08;1&#xff09;触发器&#xff08;trigger&#xff09;是用户定义在关系表上的一类由事件驱动的存储过程&#xff0c;由服务器自动激活。 &#xff08;2&#xff09;触发器可进行更为复杂的检查和操作&#xff0c;具有更精细和更强大的数…...

Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果

目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告&#xff1a;HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…...

BAPI_BATCH_CHANGE在更新后不自动更新批次特征

1、问题介绍 在CL03中看到分类特性配置了制造日期字段&#xff0c;并绑定了生产日期字段MCH1~HSDAT MSC2N修改批次的生产日期字段时&#xff0c;自动修改了对应的批次特性 但是通过BAPI&#xff1a;BAPI_BATCH_CHANGE修改生产日期时&#xff0c;并没有更新到批次特性中 2、BAPI…...

顶会评测集解读-AlignBench: 大语言模型中文对齐基准

评测集社区 CompssHub 作为司南 OpenCompass大模型评测体系的重要组成部分&#xff0c;致力于简化并加快研究人员和行业人士搜索和使用评测集的过程。评测集社区 CompssHub 目前已收录了学科、推理、知识、代码等12个方向的评测集&#xff0c;欢迎大家探索。 为了将评测集社区…...

MySQL外键类型与应用场景总结:优缺点一目了然

前言&#xff1a; MySQL的外键简介&#xff1a;在 MySQL 中&#xff0c;外键 (Foreign Key) 用于建立和强制表之间的关联&#xff0c;确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。 主要体现在引用操作发生变化时的处理方式&…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的网上书店管理系统的设计与实现

开题报告 本研究论文主要介绍了基于Spring Boot框架开发的全面网上书店管理系统的构建与实现。该系统以用户为核心&#xff0c;提供了丰富的个性化服务功能。首先&#xff0c;系统支持用户进行便捷的登录注册操作&#xff0c;并具备安全可靠的密码修改机制&#xff0c;同时允许…...

力扣面试题 - 40 迷路的机器人 C语言解法

题目&#xff1a; 设想有个机器人坐在一个网格的左上角&#xff0c;网格 r 行 c 列。机器人只能向下或向右移动&#xff0c;但不能走到一些被禁止的网格&#xff08;有障碍物&#xff09;。设计一种算法&#xff0c;寻找机器人从左上角移动到右下角的路径。 网格中的障碍物和空…...

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…...

二百八十二、ClickHouse——删除Linux中的ClickHouse

一、目的 由于ClickHosue的库表发生变化&#xff0c;需要删除原有的表结构数据&#xff0c;才能直接把脚本里文件重新安装 二、删除步骤 1、关闭ClickHouse服务 systemctl stop clickhouse-server 2、卸载ClickHouse软件包 sudo yum remove clickhouse-server clickhouse…...

c++ 命名空间使用规则

之前一直没搞懂为什么c 用了using namespace std;就能直接调用内部的类&#xff0c;直接调用内部函数 今天试着实现了一下&#xff1a; #include <iostream>// 命名空间 namespace mp{ class point{public: // 构造函数point(int x 0, int y 0) : x(x), y(y) {}//…...

从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性

作者&#xff1a;来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大&#xff0c;一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…...

Pandas系列|第二期:Pandas中的数据结构

1.Pandas中的数据结构&#xff1a;Series和DataFrame Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…...

3.多表关联在电商数据分析中的核心价值

多表关联在电商数据分析中的核心价值 第1章 多表关联、子查询与行列转换在电商数据分析中的核心价值 1.1 为什么单表查询不够用 我刚开始做数据分析的时候&#xff0c;以为SQL就是在一张表上做筛选和汇总。直到有一天&#xff0c;运营问我&#xff1a;“这批高价值用户&#xf…...

SpringBoot项目实战:用Java海康SDK搞定摄像头录像与门禁人脸下发(附完整代码)

SpringBoot企业级实战&#xff1a;海康威视SDK深度集成与智能安防系统开发 1. 企业级安防系统架构设计 在智能园区和现代化办公环境中&#xff0c;视频监控与门禁管理的无缝集成已成为刚需。海康威视作为全球领先的安防解决方案提供商&#xff0c;其设备SDK的深度集成能够为Jav…...

OpenClaw语音控制之多麦克风阵列与声源定位技术的应用

7.1 麦克风阵列基础 7.1.1 阵列定义与原理 麦克风阵列是由多个麦克风按照特定几何结构排列组成的声学传感器系统。与单麦克风相比,阵列系统通过空间采样能够实现声场的时空联合处理,从而获得方向性选择能力。这种空间处理能力是语音交互系统在复杂声学环境中保持高性能的关…...

如何用Mermaid Live Editor 5分钟创建专业图表

如何用Mermaid Live Editor 5分钟创建专业图表 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor Mermaid Live…...

终极指南:如何使用IEA-15-240-RWT 15兆瓦海上风力涡轮机参考模型开启风能研究

终极指南&#xff1a;如何使用IEA-15-240-RWT 15兆瓦海上风力涡轮机参考模型开启风能研究 【免费下载链接】IEA-15-240-RWT 15MW reference wind turbine repository developed in conjunction with IEA Wind 项目地址: https://gitcode.com/gh_mirrors/ie/IEA-15-240-RWT …...

大多数团队不是“用不好 PPO”,而是“用错了 PPO”

更多时候&#xff0c;你会听到的是&#xff1a; “PPO 太复杂了&#xff0c;算了”“调了一轮&#xff0c;模型变怪了”“感觉不如再多搞点 SFT 数据” 于是 PPO 很容易被贴上一个标签&#xff1a; “理论上很强&#xff0c;工程上很坑。” 但这个结论&#xff0c;其实并不公…...

电商客服外包怎么选|避坑指南[特殊字符]2026 商家必看

做电商绕不开客服外包&#xff0c;但低价陷阱、转包兼职、大促掉链、响应超时、售后甩锅真的太坑了&#xff01;今天整理一套不踩雷选型攻略&#xff0c;全是行业干货&#xff0c;新手也能直接抄作业&#x1f447; &#x1f6ab;先避坑&#xff1a;这些雷区千万别碰 超低价诱惑…...

避坑指南:深度相机与RGB相机标定中的5个常见错误

避坑指南&#xff1a;深度相机与RGB相机标定中的5个常见错误 在三维重建和增强现实开发中&#xff0c;深度相机与RGB相机的联合标定是基础却极易出错的关键环节。许多开发者投入大量时间调试标定结果&#xff0c;却因忽视了一些看似简单的细节而功亏一篑。本文将揭示五个最常被…...

别再只盯着Node2vec了!2024年链路预测实战:从传统打分到GNN端到端,一篇搞定

链路预测技术全景&#xff1a;从传统启发式到GNN端到端的实战演进 社交网络的好友推荐、电商平台的"猜你喜欢"、学术论文的引用预测——这些场景背后都依赖链路预测技术。作为图数据挖掘的核心任务之一&#xff0c;链路预测通过分析节点间潜在连接关系&#xff0c;为…...

[iPhone USB网络共享]完全指南:从驱动故障到高效连接

[iPhone USB网络共享]完全指南&#xff1a;从驱动故障到高效连接 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirr…...