李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
23.Golang之Channel示例
Leefs
2022-07-14 PM
1227℃
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://lilinchao.com/archives/2250.html
上一篇
22.Golang之Channel
下一篇
24.Golang之select
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Thymeleaf
Spark Core
数据结构
高并发
递归
Map
散列
Typora
人工智能
队列
锁
Kafka
JavaWeb
SpringCloud
Linux
Shiro
Spark
Golang基础
稀疏数组
Tomcat
Java
数学
Kibana
工具
JVM
MyBatisX
Hive
栈
Zookeeper
Scala
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭