go生产者消费者模型
package main
import (
"fmt"
"time"
)
// 基于channel编写一个简单的单线程生产者消费者模型
// 队列:队列长度10,队列元素类型为int
// 生产者:每1秒往队列中放入一个类型为int的元素,队列满时生产者可以阻塞
// 消费者:每1秒从队列中获取一个元素并打印,队列为空时消费者阻塞
// ch chan <- int ,定义chan 只能写进去,不能读出去,只写类型,并且只能向里面写int类型元素。可以想象下 chan <- ,从右至左,chan是个盒子,<-箭头是方向
func prodece(ch chan <- int){
for i:=0;i<10;i++{
ch <- i
time.Sleep(1*time.Second)
fmt.Printf("produce data:%d\n",i)
}
close(ch)
}
// ch <- chan int 定义chan是只能读出去,不能写进去,当然也可以不不要<-, 代表可读可写
func consumer(ch chan int){
for i := range ch{
fmt.Printf("get data:%d\n", i)
}
}
// 这样也可以
// func consumer2(ch <- chan int){
// for i := range ch{
// fmt.Printf("get data:%d\n", i)
// }
// }
func main(){
// var ch chan int,这样定义chan也可以,但是初始值时nil,不能使用,所以使用make关键字定义chan
ch := make(chan int, 10)
// go produce,让produce在协程中运行,这样不会阻塞consumer从chan中拿数据
go prodece(ch)
consumer(ch)
}
打印结果是:
get data:0 produce data:0 get data:1 produce data:1 get data:2 produce data:2 get data:3 produce data:3 get data:4 produce data:4 get data:5 produce data:5 get data:6 produce data:6 get data:7 produce data:7 get data:8 produce data:8 get data:9 produce data:9 [Done] exited with code=0 in 10.689 seconds
全世界的程序员们联合起来吧!

浙公网安备 33010602011771号