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)
}
}

  

Go语言协程并发---生产者消费者实例的更多相关文章

  1. Go语言协程并发---管道信号量应用

    package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...

  2. Go语言协程并发---互斥锁sync.Mutex

    package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...

  3. 用yield写协程实现生产者消费者

    思路: yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式 代码: import random #随机数,模拟生产者的制造物 def eat(): #消费者 ...

  4. 【Python】协程实现生产者消费者模型

    协程的实现为协作式而非抢占式的,这是和进程线程的最大区别.在Python中,利用yield和send可以很容易实现协程. 首先复习下生成器. 如果一个函数使用了yield语句,那么它就是一个生成器函数 ...

  5. Go语言协程并发---条件变量

    package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bit ...

  6. Go语言协程并发---读写锁sync.RWMutex

    package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...

  7. Go语言协程并发---等待组sync.WaitGroup

    package main import ( "fmt" "sync" "time" ) /*等待组API介绍*/ func main071( ...

  8. Go语言协程并发---原子操作

    package main import ( "fmt" "sync/atomic" ) /* 用原子来替换锁,其主要原因是: 原子操作由底层硬件支持,而锁则由操 ...

  9. Go语言协程并发---timer秒表与定时器

    秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...

随机推荐

  1. python 匿名函数,内置函数

    一 :匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使 ...

  2. 条件分支if与else的用法小结

    条件分支 今天写一写条件分支结构(if.....else),在其他的语言中条件分支结构其实不止有if --else--结构,还有swich语句(例如在C语言,Java语言).但是python中只有if ...

  3. 模拟退火算法Python编程(2)约束条件的处理

    1.最优化与线性规划 最优化问题的三要素是决策变量.目标函数和约束条件. 线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资 ...

  4. 【ElasticSearch】ES线上脏数据处理

    ES分组 GET index_user_latest/_search { "aggs": { "group_by_tags": { "terms&qu ...

  5. 将这段美化的css代码

    很多时候如果不是用了很多样式,很难把边框修饰得好看,看了一篇博文,觉得真的挺漂亮,也挺好看. 转载的博文地址 将这段美化的css代码 border:1px solid #96c2f1;backgrou ...

  6. UC-Android逆向工程师 面试题1的分析

    1.简介 这个题目是一位吾爱破解的坛友在面试UC的Android逆向工程事时,遇到的题目.此题不难,与阿里移动去年移动安全比赛的题目差不多,题目的验证方式也是查表对比,并且这个表的数据是放在文件中的. ...

  7. 将大量ASCII码值转换成字符函数CHR()的小技巧

    一.在学习命令执行漏洞的过程中,遇到以下情况: 当服务器上传不了马或者马被过滤的时候,我们可以迂回一下,通过执行写马命令到服务器,在服务器里面写马,该命令是通过ascii编码过的命令,防止被过滤. 1 ...

  8. .NET Core with 微服务 - 什么是微服务

    微服务是这几年最流行的架构,说起架构不提微服务都不好意思跟人家打招呼.最近想要再梳理一下关于微服务的知识,并且结合本人的一些实践经验来做一些总结与分享.前面会分享一些概念性的东西,后面也会使用.net ...

  9. Python数模笔记-Sklearn(2)样本聚类分析

    1.分类的分类 分类的分类?没错,分类也有不同的种类,而且在数学建模.机器学习领域常常被混淆. 首先我们谈谈有监督学习(Supervised learning)和无监督学习(Unsupervised ...

  10. Java学习之jackson篇

    Java学习之jackson篇 0x00 前言 本篇内容比较简单,简单记录. 0x01 Json 概述 概述:JSON(JavaScript Object Notation, JS 对象简谱) 是一种 ...