zoukankan      html  css  js  c++  java
  • Go语言协程并发---生产者消费者实例

    package main
    
    import (
    	"fmt"
    	"strconv"
    	"time"
    )
    
    /*
    改进生产者消费者模型
    ·生产者每秒生产一件商品,并通知物流公司取货
    ·物流公司将商品运输到商店
    ·消费者阻塞等待从商店消费
    ·消费10轮就主协程结束
    ·尝试在整分钟时通知生产者罢工,生产者罢工时主协程结束
    ·计时协程,不断地查看有没有到整分钟
    ·如果到整分钟,将【全局罢工变量】置为true
    ·生产者每完成一轮生产就查看【全局罢工变量】,如果为true就向【chGoDie】写入值
    */
    
    type Product struct {
    	Name string
    }
    
    var chGoDie = make(chan interface{})
    func main() {
    	chStorage := make(chan Product, 5)
    	chShop:= make(chan Product, 5)
    
    
    	go Producer(chStorage)
    	go Logistics(chStorage, chShop)
    	go Consumer(chShop)
    	go Watcher()
    
    	//阻塞等待狗带命令
    	<-chGoDie
    	fmt.Println("main:啊!我死了")
    }
    
    /*计时协程*/
    var Bagong = false
    func Watcher()  {
    	for true {
    		second := time.Now().Second()
    		fmt.Println("当前秒数", second)
    		if second ==0{
    			fmt.Println("罢工开始!!!!!")
    			Bagong = true
    			return
    		}
    
    		time.Sleep(time.Second)
    	}
    }
    
    /*物流公司*/
    func Logistics(chStorage chan Product, chShop chan Product)  {
    	for true {
    		product:=<-chStorage
    		chShop <- product
    		fmt.Println("转运了",product)
    	}
    
    }
    
    /*生产者*/
    func Producer(chStorage chan Product)  {
    	for {
    		product := Product{"商品" + strconv.Itoa(time.Now().Second())}
    		chStorage<-product
    		fmt.Println("生产了",product)
    		if Bagong {
    			fmt.Println("收到!Go Die主协程")
    			chGoDie <- "Go Die!"
    		}
    		time.Sleep(time.Second)
    
    	}
    }
    
    /*消费者*/
    func Consumer(chShop chan Product)  {
    	for {
    		product :=<- chShop
    		fmt.Println("消费了",product)
    	}
    }
    

      

  • 相关阅读:
    编译Excel遇到的DialogBoxW宏的实参不足问题
    C# 简单连接数据库并执行SQL查询语句
    AutoCAD VBA 遍历所有对象
    VBA: 错误消息:"类未注册"插入用户窗体
    解决Qt程序发布时中文乱码问题
    Qt操作excel
    HWND_BROADCAST的一个用法——修改环境变量,立即通知系统
    VC环境使用XML解析器(TinyXML)编程
    C++ XML解析之TinyXML篇(转载)
    C/C++枚举目录中的文件或文件夹
  • 原文地址:https://www.cnblogs.com/yunweiqiang/p/12769670.html
Copyright © 2011-2022 走看看