惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
K
Kaspersky official blog
A
Arctic Wolf
Attack and Defense Labs
Attack and Defense Labs
L
LINUX DO - 热门话题
N
News | PayPal Newsroom
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
Lohrmann on Cybersecurity
PCI Perspectives
PCI Perspectives
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Last Watchdog
The Last Watchdog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
W
WeLiveSecurity
Know Your Adversary
Know Your Adversary
博客园 - Franky
T
Tenable Blog
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Help Net Security
Help Net Security
WordPress大学
WordPress大学
T
The Exploit Database - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
J
Java Code Geeks
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Apple Machine Learning Research
Apple Machine Learning Research
NISL@THU
NISL@THU
O
OpenAI News
The Cloudflare Blog
月光博客
月光博客
Google Online Security Blog
Google Online Security Blog
V
V2EX
罗磊的独立博客
美团技术团队
博客园 - 三生石上(FineUI控件)
Security Latest
Security Latest
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cyberwarzone
Cyberwarzone
L
LINUX DO - 最新话题
Hacker News - Newest:
Hacker News - Newest: "LLM"
大猫的无限游戏
大猫的无限游戏

博客园 - ®Geovin Du Dream Park™

go: Functional Options Pattern go:Timing Functions Pattern python: Timing Functions Pattern go: Steady-State Pattern python: Steady-State Pattern go: Handshaking Pattern python: Handshaking Pattern go: Fail-Fast Pattern python: Fail-Fast Pattern I go: Deadline Pattern python: Deadline Pattern go: Circuit-Breaker Pattern python: Circuit-Breaker Pattern go: Bulkheads Pattern python: Bulkheads Pattern go: Push & Pull Pattern python: Push & Pull Pattern python: Publish/Subscribe Pattern II go: Publish/Subscribe Pattern python: Publish/Subscribe Pattern go: Futures & Promises Pattern python: Futures & Promises Pattern go: Worker Pool Pattern go:Pipeline Pattern python: Worker Pool Pattern python: Pipeline Pattern go: Fan-Out Pattern python: Fan-Out Pattern go: Fan-In Pattern python: Fan-In Pattern Fan-In python: Producer Consumer Pattern go: Parallelism Pattern python: Parallelism Pattern go: Reactor Pattern python: Reactor Pattern go: Generators Pattern python: speech to text offline python: Generators Pattern go: Coroutines Pattern python:Coroutines Pattern go: Broadcast Pattern python: Broadcast Pattern python: Bounded Parallelism Pattern go: Bounded Parallelism Pattern python: N-Barrier Pattern go: N-Barrier Pattern python: Semaphore Pattern go: Semaphore Pattern python: Read-Write Lock Pattern go: Read-Write Lock Pattern python: Monitor Pattern go: Monitor Pattern python: Mutex Pattern go: Lock/Mutex Pattern Python: Condition Variable Pattern go:Condition Variable Pattern python: Registry Pattern python: Interpreter Pattern go: Interpreter Pattern go: Registry Pattern go: Memento Pattern go: Command Pattern go: State Pattern go:Template Method Pattern go: Strategy Pattern go: Visitor Pattern go: Observer Pattern go: Mediator Pattern go: Iterator Pattern go: Chain of Responsibility Pattern go: Proxy Pattern go:Decorator Pattern go: Facade Pattern go: Flyweight Pattern go: Composite Pattern go: Singleton Pattern go: Prototype Pattern go: Bridge Pattern go: Adapter Pattern go: Builder Pattern 密码进行加盐哈希 using CSharp,Python,Go,Java go: Abstract Factory Pattern go: Model,Interface,DAL ,Factory,BLL using mysql go: Simple Factory Pattern go: Factory Method Pattern go: goLang 在Windows环境搭建Go语言开发环境 CSharp: Parallel Extensions cpp: class python: 蝴蝶跟随鼠标 javascript: 中国历史人物热力分布图using echart javascript: 中国历史人物热力图 python: 初养龙虾微信纯文字自动回复using workBuddy python: object 入门 python: Factory Method Pattern python: Simple Factory Pattern python: Abstract Factory Pattern 区域化 代码 python: Null Object Pattern python: Builder Pattern python: Adapter Pattern
go: Producer Consumer  Pattern
®Geovin Du Dream Park™ · 2026-06-19 · via 博客园 - ®Geovin Du Dream Park™
/*
# 版权所有  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     = 5
	MaxProduceCount  = 10 // 最大生产数量,达到后自动停止
	ProducerThreads  = 1
	ProcessThreads   = 2
	QualityThreads   = 1
	WarehouseThreads = 1
	SaleThreads      = 2

	// 模拟耗时(最小,最大)秒
	TimeRaw          = 1.0
	TimeRawMax       = 3.0
	TimeProcess      = 2.0
	TimeProcessMax   = 4.0
	TimeQuality      = 1.0
	TimeQualityMax   = 2.0
	TimeWarehouse    = 0.5
	TimeWarehouseMax = 1.0
	TimeSale         = 1.0
	TimeSaleMax      = 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 utils

import (
	"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 - min
	s := min + rand.Float64()*delta
	time.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 string

const (
	Raw       JewelryStage = "原料"
	Processed JewelryStage = "成品"
	Qualified JewelryStage = "已分级"
	Salable   JewelryStage = "可销售"
)

type Jewelry struct {
	ID           string
	Material     string
	Stage        JewelryStage
	QualityLevel 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 core

import (
	"godesginpattern/producerconsumer/models"
	"sync"
)

// 核心队列 & 停止管理器
// QueueManager 全局队列单例
type QueueManager struct {
	RawQueue     chan *models.Jewelry
	ProcessQueue chan *models.Jewelry
	QualityQueue chan *models.Jewelry
	SaleQueue    chan *models.Jewelry

	StopChan      chan struct{}
	ProducedCount int
	Mutex         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 true
	default:
		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 service

import (
	"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 service

import (
	"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.Processed
			mgr.ProcessQueue <- j
			utils.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.Qualified
			mgr.QualityQueue <- j
			utils.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.Salable
			mgr.SaleQueue <- j
			utils.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 bll

import (
	"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+C
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-sigChan
		utils.Info("Main", "检测到 Ctrl+C,触发优雅停止...")
		mgr.Stop()
	}()

	// 等待所有协程完成
	wg.Wait()
	utils.Info("Main", "所有业务线程已正常退出")
	utils.Info("Main", "系统正常结束,输出停止")
}