尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

go:Producer Consumer Pattern

go:Producer Consumer Pattern
📅 发布时间:2026/6/19 20:46:30

项目结构:

image

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Producer Consumer  Pattern 生产者消费者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:31
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : config.go
*/
package config// 配置层
const (QueueMaxSize     = 5MaxProduceCount  = 10 // 最大生产数量,达到后自动停止ProducerThreads  = 1ProcessThreads   = 2QualityThreads   = 1WarehouseThreads = 1SaleThreads      = 2// 模拟耗时(最小,最大)秒TimeRaw          = 1.0TimeRawMax       = 3.0TimeProcess      = 2.0TimeProcessMax   = 4.0TimeQuality      = 1.0TimeQualityMax   = 2.0TimeWarehouse    = 0.5TimeWarehouseMax = 1.0TimeSale         = 1.0TimeSaleMax      = 3.0
)var (RawMaterials  = []string{"黄金原料", "钻石原石", "翡翠原石", "铂金原料"}QualityLevels = []string{"S级(顶级)", "A级(优质)", "B级(普通)"}
)/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Producer Consumer  Pattern 生产者消费者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:32
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : utils.go
*/
package utilsimport ("fmt""math/rand""time"
)// 工具层(日志 + 耗时模拟)
func init() {rand.Seed(time.Now().UnixNano())
}// Info 统一日志输出(和 Python 格式一致)
func Info(tag, msg string) {now := time.Now().Format("2006-01-02 15:04:05")fmt.Printf("%s | INFO | %s | %s\n", now, tag, msg)
}// Sleep 模拟业务耗时
func Sleep(min, max float64) {delta := max - mins := min + rand.Float64()*deltatime.Sleep(time.Duration(s*1000) * time.Millisecond)
}// RandString 生成8位ID
func RandString() string {chars := "0123456789abcdef"res := make([]byte, 8)for i := 0; i < 8; i++ {res[i] = chars[rand.Intn(len(chars))]}return string(res)
}// RandomChoice 随机选择
func RandomChoice(list []string) string {return list[rand.Intn(len(list))]
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Producer Consumer  Pattern 生产者消费者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:32
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry.go
*/
package models// 数据模型 实体
type JewelryStage stringconst (Raw       JewelryStage = "原料"Processed JewelryStage = "成品"Qualified JewelryStage = "已分级"Salable   JewelryStage = "可销售"
)type Jewelry struct {ID           stringMaterial     stringStage        JewelryStageQualityLevel string
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Producer Consumer  Pattern 生产者消费者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:31
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : manager.go
*/
package coreimport ("godesginpattern/producerconsumer/models""sync"
)// 核心队列 & 停止管理器
// QueueManager 全局队列单例
type QueueManager struct {RawQueue     chan *models.JewelryProcessQueue chan *models.JewelryQualityQueue chan *models.JewelrySaleQueue    chan *models.JewelryStopChan      chan struct{}ProducedCount intMutex         sync.Mutex
}var instance *QueueManager
var once sync.Once// GetInstance 单例模式
func GetInstance() *QueueManager {once.Do(func() {instance = &QueueManager{RawQueue:     make(chan *models.Jewelry, 5),ProcessQueue: make(chan *models.Jewelry, 5),QualityQueue: make(chan *models.Jewelry, 5),SaleQueue:    make(chan *models.Jewelry, 5),StopChan:     make(chan struct{}),}})return instance
}// IsStopped 判断是否停止
func (m *QueueManager) IsStopped() bool {select {case <-m.StopChan:return truedefault:return false}
}// Stop 发送停止信号
func (m *QueueManager) Stop() {close(m.StopChan)
}// IncProducedCount 线程安全计数
func (m *QueueManager) IncProducedCount() int {m.Mutex.Lock()defer m.Mutex.Unlock()m.ProducedCount++return m.ProducedCount
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Producer Consumer  Pattern 生产者消费者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:32
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : producer.go
*/
package serviceimport ("fmt""godesginpattern/producerconsumer/config""godesginpattern/producerconsumer/core""godesginpattern/producerconsumer/models""godesginpattern/producerconsumer/utils"
)// 原料生产者
func RawMaterialProducer() {mgr := core.GetInstance()for !mgr.IsStopped() {utils.Sleep(config.TimeRaw, config.TimeRawMax)mat := utils.RandomChoice(config.RawMaterials)j := &models.Jewelry{ID:       utils.RandString(),Material: mat,Stage:    models.Raw,}select {case mgr.RawQueue <- j:cnt := mgr.IncProducedCount()utils.Info("ProducerService",fmt.Sprintf("原料采购完成 | [原料]%s | 队列剩余: %d | 已生产:%d/%d",mat, len(mgr.RawQueue), cnt, config.MaxProduceCount))if cnt >= config.MaxProduceCount {utils.Info("ProducerService", "已达到最大生产数量,准备停止生产")mgr.Stop()return}case <-mgr.StopChan:return}}
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Producer Consumer  Pattern 生产者消费者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:32
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : consumer.go
*/
package serviceimport ("fmt""godesginpattern/producerconsumer/config""godesginpattern/producerconsumer/core""godesginpattern/producerconsumer/models""godesginpattern/producerconsumer/utils"
)// 全流程消费者(加工 / 质检 / 仓储 / 销售)
// ProcessConsumer 加工
func ProcessConsumer() {mgr := core.GetInstance()for {select {case j := <-mgr.RawQueue:utils.Sleep(config.TimeProcess, config.TimeProcessMax)utils.Info("ConsumerService", fmt.Sprintf("开始加工 | [%s]%s", j.Stage, j.Material))j.Stage = models.Processedmgr.ProcessQueue <- jutils.Info("ConsumerService",fmt.Sprintf("加工完成 | [成品]%s | 队列剩余: %d", j.Material, len(mgr.ProcessQueue)))case <-mgr.StopChan:if len(mgr.RawQueue) == 0 {return}}}
}// QualityConsumer 质检
func QualityConsumer() {mgr := core.GetInstance()for {select {case j := <-mgr.ProcessQueue:utils.Sleep(config.TimeQuality, config.TimeQualityMax)utils.Info("ConsumerService", fmt.Sprintf("开始质检 | [%s]%s", j.Stage, j.Material))j.QualityLevel = utils.RandomChoice(config.QualityLevels)j.Stage = models.Qualifiedmgr.QualityQueue <- jutils.Info("ConsumerService",fmt.Sprintf("质检完成 | %s%s | 队列剩余: %d", j.QualityLevel, j.Material, len(mgr.QualityQueue)))case <-mgr.StopChan:if len(mgr.ProcessQueue) == 0 {return}}}
}// WarehouseConsumer 仓储
func WarehouseConsumer() {mgr := core.GetInstance()for {select {case j := <-mgr.QualityQueue:utils.Sleep(config.TimeWarehouse, config.TimeWarehouseMax)utils.Info("ConsumerService", fmt.Sprintf("开始入库 | [%s]%s%s", j.Stage, j.QualityLevel, j.Material))j.Stage = models.Salablemgr.SaleQueue <- jutils.Info("ConsumerService",fmt.Sprintf("入库完成 | %s%s(已入库可销售) | 队列剩余: %d", j.QualityLevel, j.Material, len(mgr.SaleQueue)))case <-mgr.StopChan:if len(mgr.QualityQueue) == 0 {return}}}
}// SaleConsumer 销售
func SaleConsumer() {mgr := core.GetInstance()for {select {case j := <-mgr.SaleQueue:utils.Sleep(config.TimeSale, config.TimeSaleMax)utils.Info("ConsumerService",fmt.Sprintf("开始销售 | [可销售]%s%s(已入库可销售)", j.QualityLevel, j.Material))utils.Info("ConsumerService",fmt.Sprintf("销售成功 | %s%s(已入库可销售)\n", j.QualityLevel, j.Material))case <-mgr.StopChan:if len(mgr.SaleQueue) == 0 {return}}}
}

  

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/19 19:46
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : producerconsumerbll.go
*/
package bllimport ("fmt""godesginpattern/producerconsumer/config""godesginpattern/producerconsumer/core""godesginpattern/producerconsumer/service""godesginpattern/producerconsumer/utils""os""os/signal""sync""syscall"
)// 启动所有 Goroutine
func ProducerConsumerMain() {utils.Info("Main", "============================================================")utils.Info("Main", "珠宝全流程生产销售系统(企业级生产者消费者模式)")utils.Info("Main", fmt.Sprintf("最大生产数量限制:%d", config.MaxProduceCount))utils.Info("Main", "============================================================")mgr := core.GetInstance()var wg sync.WaitGroup// 启动生产者for i := 0; i < config.ProducerThreads; i++ {wg.Add(1)go func() {defer wg.Done()service.RawMaterialProducer()}()}// 启动消费者for i := 0; i < config.ProcessThreads; i++ {wg.Add(1)go func() {defer wg.Done()service.ProcessConsumer()}()}for i := 0; i < config.QualityThreads; i++ {wg.Add(1)go func() {defer wg.Done()service.QualityConsumer()}()}for i := 0; i < config.WarehouseThreads; i++ {wg.Add(1)go func() {defer wg.Done()service.WarehouseConsumer()}()}for i := 0; i < config.SaleThreads; i++ {wg.Add(1)go func() {defer wg.Done()service.SaleConsumer()}()}// 监听 Ctrl+CsigChan := make(chan os.Signal, 1)signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)go func() {<-sigChanutils.Info("Main", "检测到 Ctrl+C,触发优雅停止...")mgr.Stop()}()// 等待所有协程完成wg.Wait()utils.Info("Main", "所有业务线程已正常退出")utils.Info("Main", "系统正常结束,输出停止")
}

  

输出:

image

 

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)

相关新闻

  • 高温冶炼车间炉前工位工业平板采购方案,避开高温死机故障
  • AWS 删除用户的权限会发生什么
  • 普宁哪家家具又好又便宜|质量过硬价格透明哪家店 - 品牌观察

最新新闻

  • WechatBakTool:如何安全备份微信聊天记录的技术实现解析
  • 5分钟掌握B站智能评论分析:成分检测器完整指南
  • 2026深圳宝安搬家公司臻选:居民/企业/专业搬迁全场景优质搬迁服务商榜单 - 从来都是英雄出少年
  • MC9S12XE PWM引擎深度解析:从时钟架构到紧急关断安全设计
  • A卡炼丹环境搭建避坑指南:从RX 6700 XT驱动到PyTorch实战部署
  • AI为何像差生:从学习机制看模型泛化失效

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号