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语言中,生产者消费者模式可以通过使用Goroutines和Channels来实现。Goroutines允许并发执行,而Channels则用于在生产者和消费者之间安全地传递数据。 生产者消费者模式的基本思路 生产者:负责生成数据并将其放入一个共享的缓冲区…...
自动化测试-Pytest测试
目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest是一个非常流行的Python测试框架,它支持简单的单元测试和复杂的功能测试,具有易于上手、功…...
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】等式构造
文章目录 题目题目描述输入输出格式数据范围测试样例 思路代码复杂度分析时间复杂度空间复杂度 题目 题目链接🔗 题目描述 有关 「上述等式为何正确」 的问题解决了,然而 「如何构造出上述那种让人啼笑皆非的正确等式」 成为了一个新的问题。 我们认…...
Kafka数据迁移全解析:同集群和跨集群
文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景,分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景: broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践: 将需要新添加…...
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"> <!-- 官网提供…...
三只脚的电感是什么东西?
最近在做加湿器,把水雾化的陶瓷片需要有专门的驱动电路。 我参考了某宝卖家的驱动板以及网上的开源项目,发现了驱动电路的核心就是一个三脚电感。 在此之前我都没注意过这玩意,三脚电感不也还是电感嘛? 今天我们就来看看三脚电…...
【数据库学习笔记】SQL触发器(例题+代码)
数据库SQL 1、触发器概念 (1)触发器(trigger)是用户定义在关系表上的一类由事件驱动的存储过程,由服务器自动激活。 (2)触发器可进行更为复杂的检查和操作,具有更精细和更强大的数…...
Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果
目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告:HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…...
BAPI_BATCH_CHANGE在更新后不自动更新批次特征
1、问题介绍 在CL03中看到分类特性配置了制造日期字段,并绑定了生产日期字段MCH1~HSDAT MSC2N修改批次的生产日期字段时,自动修改了对应的批次特性 但是通过BAPI:BAPI_BATCH_CHANGE修改生产日期时,并没有更新到批次特性中 2、BAPI…...
顶会评测集解读-AlignBench: 大语言模型中文对齐基准
评测集社区 CompssHub 作为司南 OpenCompass大模型评测体系的重要组成部分,致力于简化并加快研究人员和行业人士搜索和使用评测集的过程。评测集社区 CompssHub 目前已收录了学科、推理、知识、代码等12个方向的评测集,欢迎大家探索。 为了将评测集社区…...
MySQL外键类型与应用场景总结:优缺点一目了然
前言: MySQL的外键简介:在 MySQL 中,外键 (Foreign Key) 用于建立和强制表之间的关联,确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。 主要体现在引用操作发生变化时的处理方式&…...
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的网上书店管理系统的设计与实现
开题报告 本研究论文主要介绍了基于Spring Boot框架开发的全面网上书店管理系统的构建与实现。该系统以用户为核心,提供了丰富的个性化服务功能。首先,系统支持用户进行便捷的登录注册操作,并具备安全可靠的密码修改机制,同时允许…...
力扣面试题 - 40 迷路的机器人 C语言解法
题目: 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。 网格中的障碍物和空…...
ElementPlus 自定义封装 el-date-picker 的快捷功能
文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下,但是不太满足我们用户想要的快捷功能,因为不太多,因此需要我们自己封装一些,方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…...
二百八十二、ClickHouse——删除Linux中的ClickHouse
一、目的 由于ClickHosue的库表发生变化,需要删除原有的表结构数据,才能直接把脚本里文件重新安装 二、删除步骤 1、关闭ClickHouse服务 systemctl stop clickhouse-server 2、卸载ClickHouse软件包 sudo yum remove clickhouse-server clickhouse…...
c++ 命名空间使用规则
之前一直没搞懂为什么c 用了using namespace std;就能直接调用内部的类,直接调用内部函数 今天试着实现了一下: #include <iostream>// 命名空间 namespace mp{ class point{public: // 构造函数point(int x 0, int y 0) : x(x), y(y) {}//…...
从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性
作者:来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大,一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…...
Pandas系列|第二期:Pandas中的数据结构
1.Pandas中的数据结构:Series和DataFrame Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
