李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
23.Golang之Channel示例
Leefs
2022-07-14 PM
611℃
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
43
标签云
机器学习
Hive
ajax
Sentinel
Quartz
Typora
队列
Hadoop
Spark RDD
Netty
Java阻塞队列
HDFS
Nacos
Elasticsearch
Map
ClickHouse
Zookeeper
人工智能
Kafka
Flink
Spark Core
Golang基础
Java
GET和POST
Docker
MyBatisX
Http
SpringBoot
Stream流
Thymeleaf
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞