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
全世界的程序员们联合起来吧!
原文地址:https://www.cnblogs.com/chaojiyingxiong/p/15743560.html