前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go chan 两种应用模型

go chan 两种应用模型

作者头像
地球流浪猫
发布2018-08-02 15:36:21
3000
发布2018-08-02 15:36:21
举报
文章被收录于专栏:流浪猫的golang流浪猫的golang
第一种模型:主线程等待所有协程完成,主线程阻塞等待所有协程完成。  
package main

import (
	"fmt"
	"math/rand"
	"time"
)
// go 协程应用之一
// 创建10个线程
//主线程阻塞,等待所有子线程计算完成
// 子线程完成把结果放在子线程中

func main()  {
	var testchan =make(chan int ,10)
	for i:=0;i<10 ;i++ {
		go child(testchan,i)
	}
	for i:=0;i<10 ;i++  {
		a:=<-testchan
		fmt.Println("协程完成:",a)
	}
	fmt.Println("主程完成")

}

func child(mychan chan int,index int  ){
	/*
	这里遇到一个问题 线程休眠需要一个 time.Duration类型的参数,也就是int64
	参数 此时必须将 int 转换成 time.Duration 参数类型
	用 time.Duration(int(要转换的数据)) 即可转换
	*/
	time.Sleep(time.Second*time.Duration(rand.Intn(10)))
	mychan<-index;

}

    运行:

    协程完成: 7     协程完成: 8     协程完成: 2     协程完成: 5     协程完成: 4     协程完成: 6     协程完成: 1     协程完成: 0     协程完成: 3     协程完成: 9     主程完成

第二种模型:生产者和消费者模型,生产一个消费一个,谁的速度过快谁等待。
package main

import (
	"time"
	"fmt"
	"math/rand"
)

/*
chan 应用生产者和消费者模型
生产者每生产一个东西和消费者就消费一个东西
消费者消费东西速度过快,生产者者跟不上,消费者就阻塞.
生产者生产东西过快,消费者跟不上,生产者阻塞
叫做同步的生产与消费

如果想拥有一个生产缓冲区,缓存一下 可以设置chan 缓存 cpChan:=make(chan int ,4)
这样就变成非同步的生产与消费

*/

func main() {
	cpChan:=make(chan int)
	go  consumer(cpChan)
	go  producter(cpChan)

	time.Sleep(time.Second*10)
}

func producter(cpChan chan int) {
	for i:=0; i<10;i++  {
		fmt.Println("生产:",i)
		cpChan<-i
		time.Sleep(time.Millisecond*time.Duration(rand.Intn(1000)))
	}
}

func consumer(cpChan chan int) {
	for i:=0; i<10;i++  {
		p1:=<-cpChan
		fmt.Println("消费了",p1)
		time.Sleep(time.Millisecond*time.Duration(rand.Intn(1000)))
	}
}

 运行结果:

    生产: 0     消费了 0     生产: 1     消费了 1     生产: 2     消费了 2     生产: 3     消费了 3     生产: 4     消费了 4     生产: 5     消费了 5     生产: 6     消费了 6     生产: 7     消费了 7     生产: 8     消费了 8     生产: 9

    消费了 9

两种chan 应用,go 写代码还是很爽快的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年02月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档