李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
23.Golang之Channel示例
Leefs
2022-07-14 PM
714℃
0条
[TOC] ### 前言 ![23.Golang之Channel示例01.jpeg](https://lilinchao.com/usr/uploads/2022/07/3628343236.jpeg) ### 示例一 > 需求:定义两个方法,一个方法向通道里面写数据,一个向通道里面读取数据。 > > 要求同步进行 **说明** ``` 1、开启一个 fn1 的协程向通道 inChan 中写入 100 条数据 2、开启一个 fn2 的协程读取 inChan 中写入的数据 3、注意:fn1 和 fn2 同时操作一个通道 4、主线程必须等待操作完成后才可以退出 ``` **代码** ```go import ( "fmt" "sync" "time" ) /** goroutine结合Channel使用的简单demo,定义两个方法,一个方法给通道里面写数据,一个给通道里面读取数据。要求同步进行。 */ var wg sync.WaitGroup //写数据 func fn1(ch chan int){ for i := 1; i <= 10; i++ { ch <- i fmt.Printf("写入数据\t%v\t成功\n",i) time.Sleep(time.Millisecond * 500) } close(ch) wg.Done() } //读数据 func fn2(ch chan int){ for v := range ch { fmt.Printf("读取数据\t%v\t成功\n",v) time.Sleep(time.Millisecond * 10) } wg.Done() } func main() { var ch = make(chan int,10) wg.Add(1) go fn1(ch) wg.Add(1) go fn2(ch) wg.Wait() fmt.Println("退出...") } ``` **运行结果** ``` 写入数据 1 成功 读取数据 1 成功 读取数据 2 成功 写入数据 2 成功 写入数据 3 成功 读取数据 3 成功 写入数据 4 成功 读取数据 4 成功 写入数据 5 成功 读取数据 5 成功 写入数据 6 成功 读取数据 6 成功 写入数据 7 成功 读取数据 7 成功 写入数据 8 成功 读取数据 8 成功 写入数据 9 成功 读取数据 9 成功 写入数据 10 成功 读取数据 10 成功 退出... ``` ### 示例二 > 需求:goroutine 结合 channel 实现统计 1-120000 的数字中哪些是素数? **代码** ```go import ( "fmt" "sync" "time" ) var wg3 sync.WaitGroup //向 intChan放入 1-120000个数 func putNum(intChan chan int){ for i := 2;i < 120000; i++ { intChan <- i } close(intChan) wg3.Done() } // 从 intChan取出数据,并判断是否为素数,如果是,就把得到的素数放在primeChan func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){ for num := range intChan { var flag = true for i := 2; i < num; i++ { if num % i == 0 { flag = false break } } if flag { primeChan <- num //num是素数 } } //要关闭 primeChan // close(primeChan) //如果一个channel关闭了就没法给这个channel发送数据了 //什么时候关闭primeChan? //给exitChan里面放入一条数据 exitChan <- true wg3.Done() } //printPrime打印素数的方法 func printPrime(primeChan chan int) { //for v := range primeChan { // // fmt.Println(v) // //} wg3.Done() } func main() { start := time.Now().Unix() intChan := make(chan int, 1000) primeChan := make(chan int, 50000) exitChan := make(chan bool,16) //标识primeChan close //存放数字的协程 wg3.Add(1) go putNum(intChan) //统计素数的协程 for i := 0; i < 16; i++ { wg3.Add(1) go primeNum(intChan,primeChan,exitChan) } //打印素数的协程 wg3.Add(1) go printPrime(primeChan) //判断exitChan是否存满值 wg3.Add(1) go func() { for i := 0; i < 16; i++ { <- exitChan } //关闭primeChan close(primeChan) wg3.Done() }() wg3.Wait() end := time.Now().Unix() fmt.Println("执行完毕...",end - start,"毫秒") } ``` **运行结果** ``` 执行完毕... 2 毫秒 ```
标签:
Golang基础
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/2250.html
上一篇
22.Golang之Channel
下一篇
24.Golang之select
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
二叉树
GET和POST
VUE
Stream流
字符串
Typora
Docker
Jenkins
Beego
微服务
JavaWEB项目搭建
BurpSuite
JavaSE
Livy
国产数据库改造
Java编程思想
RSA加解密
Ubuntu
工具
前端
查找
算法
序列化和反序列化
并发编程
Azkaban
Hive
nginx
JVM
Kafka
Java阻塞队列
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞