【go每日一题】 实现生产者消费者模式

ops/2024/12/20 18:47:39/

基本描述

golang使用并发编程,实现一个生产者消费者模式,消费的任务耗时1-3秒,希望最终10秒内能够消费尽可能多的任务

代码

package testimport ("fmt""math/rand""testing""time"
)type ConsumeTask struct {id       intexecFunc func()
}type Producer struct {id intch chan *ConsumeTask
}type Consumer struct {id intch chan *ConsumeTask
}func TestProducerConsumer(t *testing.T) {taskCh := make(chan *ConsumeTask, 100)defer close(taskCh)producers := make([]*Producer, 0, 10)consumers := make([]*Consumer, 0, 5)// 创建十个消费者for i := 0; i < 10; i++ {consumers = append(consumers, NewConsumer(i, taskCh))}// 创建十个生产者for i := 0; i < 10; i++ {producers = append(producers, NewProducer(i, taskCh))}tasks := make(chan *ConsumeTask, 100)for i := 0; i < 100; i++ {t := &ConsumeTask{id: i,execFunc: func() {dura := time.Duration(rand.Intn(3)+1) * time.Secondtime.Sleep(dura)fmt.Println("已经睡眠:", dura.String(), "s, 任务", i, "执行中...")},}tasks <- t}defer close(tasks)for _, producer := range producers {// 闭包问题//go func() {//	for t := range tasks {//		producer.Produce(t)//	}//}()go func(p *Producer) {for t := range tasks {p.Produce(t)}}(producer)}for _, consumer := range consumers { 闭包问题//go func() {//	consumer.Consume()//}()go func(c *Consumer) {c.Consume()}(consumer)}time.Sleep(time.Second * 10)}func NewProducer(id int, ch chan *ConsumeTask) *Producer {return &Producer{id: id,ch: ch,}
}func NewConsumer(id int, ch chan *ConsumeTask) *Consumer {return &Consumer{id: id,ch: ch,}
}func (p *Producer) Produce(task *ConsumeTask) {p.ch <- task
}func (c *Consumer) Consume() {for task := range c.ch {fmt.Printf("消费者%d,正在消费\n", c.id)task.execFunc()}
}

结果分析

.....
已经睡眠: 1s s, 任务 26 执行中...
消费者6,正在消费
已经睡眠: 2s s, 任务 27 执行中...
消费者5,正在消费
已经睡眠: 1s s, 任务 30 执行中...
消费者3,正在消费
已经睡眠: 1s s, 任务 32 执行中...
消费者2,正在消费
已经睡眠: 3s s, 任务 22 执行中...
消费者8,正在消费
已经睡眠: 1s s, 任务 35 执行中...
消费者6,正在消费
已经睡眠: 1s s, 任务 37 执行中...
消费者3,正在消费
已经睡眠: 1s s, 任务 36 执行中...
消费者5,正在消费
已经睡眠: 2s s, 任务 29 执行中...
消费者4,正在消费
已经睡眠: 2s s, 任务 31 执行中...
消费者9,正在消费
已经睡眠: 1s s, 任务 39 执行中...
消费者8,正在消费
已经睡眠: 3s s, 任务 28 执行中...
消费者0,正在消费
已经睡眠: 2s s, 任务 38 执行中...
消费者2,正在消费
已经睡眠: 3s s, 任务 33 执行中...
消费者1,正在消费
已经睡眠: 3s s, 任务 34 执行中...
消费者7,正在消费
已经睡眠: 1s s, 任务 44 执行中...
消费者9,正在消费
已经睡眠: 1s s, 任务 41 执行中...
消费者3,正在消费
已经睡眠: 1s s, 任务 42 执行中...
消费者5,正在消费
已经睡眠: 1s s, 任务 45 执行中...
消费者8,正在消费
已经睡眠: 1s s, 任务 46 执行中...
消费者0,正在消费
--- PASS: TestProducerConsumer (10.00s)
PASS

可以看到,10s的时间内,每个任务耗时1-3s下,一共消费了46个任务,相比于顺序消费(3-10)个任务效率高了很多


http://www.ppmy.cn/ops/143552.html

相关文章

【python实战】-- 解压提取所有指定文件的指定内容

系列文章目录 文章目录 系列文章目录前言一、pandas是什么&#xff1f;1、需求2、程序 总结 前言 一、pandas是什么&#xff1f; 1、需求 指定目录下有若干文件 批量解压 需要汇总包含指定字符的所有文件中的指定数据 2、程序 import os import shutil import zipfile impor…

LIF神经元模型的显隐转换

本文星主将介绍LIF神经元模型的显式和隐式转换&#xff08;星主看见有论文[1]是这个称呼的&#xff0c;所以本文也称显式和隐式&#xff09;&#xff0c;并得到隐式模型的解析解。注意&#xff1a;理解本文内容需要有一定的微积分基础&#xff0c;如果大家看着数学头疼&#xf…

【GCC】2015: draft-alvestrand-rmcat-congestion-03 机器翻译

腾讯云的一个分析,明显是看了这个论文和草案的 : 最新的是应该是这个 A Google Congestion Control Algorithm for Real-Time Communication draft-ietf-rmcat-gcc-02 下面的这个应该过期了: draft-alvestrand-rmcat-congestion-03

Differential Transformer: 通过差分注意力机制提升大语言模型性能

Transformer模型已经成为大语言模型&#xff08;LLMs&#xff09;的标准架构&#xff0c;但研究表明这些模型在准确检索关键信息方面仍面临挑战。今天介绍一篇名叫Differential Transformer的论文&#xff0c;论文的作者观察到一个关键问题&#xff1a;传统Transformer模型倾向…

使用宝塔面板中的Nginx部署前端Vue项目

我相信已经到这一步了&#xff0c;Nginx和宝塔过多的描述我就不说了&#xff0c;直接上干货实操。 第一步&#xff1a;前端项目打包 直接运行Npm run build命令进行打包&#xff0c;会打成一个dist的压缩包 注意&#xff1a;我们前端打包的时候要修改我们连接后端接口的&…

玩一下FPGA(TODO)

Intel Cyclone IV 是一款流行的 FPGA (现场可编程门阵列) 系列&#xff0c;广泛用于嵌入式设计和各种硬件加速应用。要用 Intel Cyclone IV 实现一个最简单的功能&#xff0c;我们可以从设计一个基础的 LED 控制器开始&#xff0c;这个设计可以作为一个入门项目来帮助你理解 FP…

用python实现滑雪小游戏,附源码

一个简单的基于文本的滑雪小游戏示例代码&#xff0c;在这个游戏中玩家控制一个滑雪者在有障碍物的雪道上滑行&#xff0c;尽量避开障碍物并获取更高的分数。 ● Skier类表示滑雪者&#xff0c;有位置属性和移动、转向方法。 ● Obstacle类表示障碍物&#xff0c;有位置属…

鸿蒙项目云捐助第九讲鸿蒙App应用的捐助详情页功能实现

鸿蒙项目云捐助第九讲鸿蒙App应用的捐助详情页功能实现 这里接下来继续实现捐助详情页的布局页面&#xff0c;也就是当用户进入到分类页面后&#xff0c;点击分类的每一个商品就进入到捐助商品的详情页&#xff0c;这里的布局可以从下面的模板演化而来。 下面根据这个模板来进…