开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程:协程配合管道的综合案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9757
协程配合管道的综合案例
内容介绍:
一、goroutine 和 channel 结合
二、课后练习
一、goroutine 和 channel 结合
前边讲到的关于管道的知识点,管道的定义、特点、关闭、遍历,都是为了先前提出的问题。解决实用案例。
1. 应用实例1
请完成 goroutine 和 channel 协同工作的案例,具体要求:
1)开启一个 writeData 协程,向管道 intChan 中写入50个整数.
2)开启一个 readData 协程,从管道 intChan 中读取 writeData 写入的数据。
3)注意: writeData 和 readDate 操作的是同一个管道
4)主线程需要等待 writeData 和 readDate 协程都完成工作才能退出【管道】
思路分析示意图如下:
开启两个协程,一个写入数据(writeDate),一个读取数据(readDate);管道是引用类型,即读和写的是同一个管道。开启两个协程,分别写入和读取数据。等待时间不能使用 sleep,需要等待 writeDate 和 readDate 协程都完成工作才能退出。思路分析完之后,更利于理解和分析。主线程需要等待两个协程全部完成后即可与退出。
2. 代码的实现:
1
package main
2
import (
3 "fmt"
4 )
5
6
7 //write Data
8 func writeData(intchan chan int) {
9 for i := 1; i <= 50; i++ {
10
//放入数据
11
intchan<- i
12
}
13 }
14
1
5
16
/
/read data
17
func readData(intchan chan int,exitchan chan bool){
18
19for {
20 v, ok := <-intchan
21 if !ok {
22break
23 }
24 fmt.Printf( "readData读到数据=%v\n", v)
25
}
26 // readData读取完数据后,即任务完成
27 exitchan<- true
28 close(exitchan)}
29
30 //创建两个管道
31 intchan := make( chan int. 50)
32 exitchan := make(chan bool,1)
33 go writeData(intchan)
34 go readData(intchan, exitchan)
35
/
/time-sleep
(
time.second*10
)
36 for{
37 ok := <-exitchan
38if !ok {
39break
40}
41}
开启两个协程,分别写入和读取数据。先创建两个管道,分别放入50个数据,当把50个数据写完,关闭管道,返回两个值,一个是数据,另一个是是否 ok,如果没有 close,下面的管道就会失锁,读取完数据后,即任务完成。
等待时间不能使用 sleep,需要等待 writeDate 和 readDate 协程都完成工作才能退出。思路分析完之后,更利于理解和分析。
二、课后练习
1. 作业1:goroutine 练习
课堂练习(学员练习)
要求:
1)启动一个协程,将1-2000的数放入到一个 channel 中 ,比如 numChan
2)启动8个协程、从 numChan 取出数(比如 n),并计算1+..+n 的值,并存放到 resChan
3)最后8个协程协同完成工作后,再遍历 resChan,显示结果[如 res[1]= 1 ..res[10]=55..]
4)注意:考虑 resChan chan int 是否合适?
有一个协程写入,有三个协程取出,最后结果放入一个管道中,最后将结果打印出来。
2.读写 channel 课堂练习/课后练习
说明:请完成如下案例:
1)创建一个 Person 结构体[Name, Age,Address]
2)使用 rand 方法配合随机创建10个 Person 实例,并放入到 channel 中.
3)遍历 channel ,将各个 Person 实例的信息显示在终端...
3.使用协程+管道,解决上午提出问题.
4.作业2:goroutine + channel 配合完成排序,并写入文件
要求:
1)开一个协程 writeDataToFile,随机生成1000个数据,存放到文件中
2)当 writeDataToFile 完成写1000个数据到文件后,让 sort 协程从文件中读取1000个文件,并完成排序,重新写入到另外一个文件
3)考察点:协程和管道+文件的综合使用
4)功能扩展:开10个协程 writeDataToFile,每个协程随机生成1000个数据,存放到10文件中
5)当10个文件都生成了,让10个 sort 协程从10文件中读取1000个文件,并完成排序,重新写入到10个结果文件