协程配合管道的综合案例 | 学习笔记

简介: 快速学习协程配合管道的综合案例

开发者学堂课程【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 协程都完成工作才能退出【管道】

思路分析示意图如下:

image.png

开启两个协程,一个写入数据(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

15

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-sleeptime.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, AgeAddress]

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个结果文件

相关文章
|
3天前
|
C++
C/C++协程学习笔记
C/C++协程学习笔记
|
3天前
|
存储 前端开发 rax
协程学习笔记
协程学习笔记
36 0
|
3天前
|
存储 前端开发 rax
协程学习笔记 NtyCo/libgo
协程学习笔记 NtyCo/libgo
36 0
|
7月前
|
安全 调度 数据库
Kotlin 学习笔记(五)—— 协程的基础知识,面试官的最爱了~(下)
Kotlin 学习笔记(五)—— 协程的基础知识,面试官的最爱了~(下)
45 0
|
7月前
|
Java Go Android开发
Kotlin 学习笔记(五)—— 协程的基础知识,面试官的最爱了~(上)
Kotlin 学习笔记(五)—— 协程的基础知识,面试官的最爱了~(上)
54 0
|
7月前
|
Linux Go 调度
Go学习笔记-协程和IO多路复用
Go学习笔记-协程和IO多路复用
100 0
Go学习笔记-协程和IO多路复用
|
网络协议 安全 测试技术
协程并发(并行)资源竞争问题 | 学习笔记
快速学习协程并发(并行)资源竞争问题
119 0
协程并发(并行)资源竞争问题 | 学习笔记
|
网络协议 测试技术 Go
协程快速入门 | 学习笔记
快速学习协程快速入门
93 0
协程快速入门 | 学习笔记
|
网络协议 安全 测试技术
协程求素数的代码实现 | 学习笔记
快速学习协程求素数的代码实现
81 0
协程求素数的代码实现 | 学习笔记
|
网络协议 Unix 测试技术
协程求素数的代码效率测试 | 学习笔记
快速学习协程求素数的代码效率测试
83 0
协程求素数的代码效率测试 | 学习笔记