• 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
    
    全世界的程序员们联合起来吧!
  • 相关阅读:
    第二次作业——结对项目之需求分析与原型模型设计
    第三次作业——结对编程
    采用PowerDesigner 设计数据库
    关于Android开发环境的演变
    广东地区DNS再次瘫痪
    SQL Server 2005 TSQL 中的OUTPUT子句语法
    Visual Studio 里的版本兼容问题
    Javascript 对象扩展积累
    IBatisNet.DataMapper 升级到 1.6.2 之后报错
    ExtJs Extender controls 不错的例子
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/15743560.html
Copyright © 2020-2023  润新知