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)
}
}
Go语言协程并发---生产者消费者实例的更多相关文章
- Go语言协程并发---管道信号量应用
package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...
- Go语言协程并发---互斥锁sync.Mutex
package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...
- 用yield写协程实现生产者消费者
思路: yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式 代码: import random #随机数,模拟生产者的制造物 def eat(): #消费者 ...
- 【Python】协程实现生产者消费者模型
协程的实现为协作式而非抢占式的,这是和进程线程的最大区别.在Python中,利用yield和send可以很容易实现协程. 首先复习下生成器. 如果一个函数使用了yield语句,那么它就是一个生成器函数 ...
- Go语言协程并发---条件变量
package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bit ...
- Go语言协程并发---读写锁sync.RWMutex
package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...
- Go语言协程并发---等待组sync.WaitGroup
package main import ( "fmt" "sync" "time" ) /*等待组API介绍*/ func main071( ...
- Go语言协程并发---原子操作
package main import ( "fmt" "sync/atomic" ) /* 用原子来替换锁,其主要原因是: 原子操作由底层硬件支持,而锁则由操 ...
- Go语言协程并发---timer秒表与定时器
秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...
随机推荐
- Nginx篇
1 基本操作命令 先CD到nginx.exe目录 启动nginx服务 nginx start nginx 优雅停止nginx,有连接时会等连接请求完成再杀死worker进程 nginx -s quit ...
- Bootstrap工具包--用于响应式布局和移动设备优先的web项目
Bootstrap是用于前端开发的工具包,是一个css/html框架 用于响应式布局和移动设备优先的web项目 响应式布局--一个网站能兼容多个终端 有很多版本:v3,v4,v5 三个没啥区别 ...
- Android最新敲诈者病毒分析及解锁(11月版)
一.样本信息 文件名称:久秒名片赞,(无需积分s)(2)(1)(1).apk 文件大小:1497829字节 文件类型:application/jar 病毒类型:Android.CtLocker 样本包 ...
- Wordpress主题编辑器漏洞复现
Wordpress是全球流行的博客网站,全球有上百万人使用它来搭建博客.他使用PHP脚本和Mysql数据库来搭建网站. 那么,如果当我们在渗透测试过程中获得到了别人Wordpress的账号和密码之后, ...
- Mybatis的初始化和结合Spring Framework后初始化的源码探究
带着下面的问题进行学习: (1)Mybatis 框架或 Spring Framework 框架对数据层 Mapper 接口做了代理,那是做了 JDK 动态代理还是 CGLIB 代理? (2)Mappe ...
- JavaWeb——反射、注解
单元测试.反射.注解 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要 ...
- Spring cloud 基础框架集成
Spring cloud 基础框架集成 1. 注册中心 -eurekar 1. pom依赖 <?xml version="1.0" encoding="UTF-8& ...
- istio部署问题Q&A
端口绑定无权限 创建Gateway,提示绑定端口无权限. 2020-12-27T12:25:30.974288Z warning envoy config gRPC config for type.g ...
- [DB] 数据库的连接
概述 集合运算:交,差,并,笛卡尔积 关系运算:选择,投影,连接,除 集合运算是关系运算的基础,关系运算可以用SQL语句表达 连接(join):从两个关系(表)的笛卡儿积中选取属性(列)间满足一定条件 ...
- qemu:///system 没有连接驱动器可用;读取数据时进入文件终点: 输入/输出错误
原因 1. KVM的相关包 装少了 2KVM的相关包 重新安装 3 May 31 15:22:55 localhost libvirtd: 2019-05-31 07:22:55.554+0000: ...