李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
23.Golang之Channel示例
Leefs
2022-07-14 PM
526℃
0条
[TOC] ### 前言  ### 示例一 > 需求:定义两个方法,一个方法向通道里面写数据,一个向通道里面读取数据。 > > 要求同步进行 **说明** ``` 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
40
标签云
Flink
机器学习
Spark Core
Java阻塞队列
随笔
MyBatisX
Hadoop
Spring
Docker
队列
CentOS
SQL练习题
设计模式
持有对象
Ubuntu
Nacos
哈希表
Java工具类
NIO
BurpSuite
Netty
Shiro
Filter
锁
HDFS
ClickHouse
Scala
序列化和反序列化
数学
SpringCloudAlibaba
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞