go的协程和管道运用案例

一.同时向管道读写数据

package mainimport "fmt"func main() {writeChan := make(chan int, 20)   // 写入通道,缓冲大小为20exitChan := make(chan bool)   // 退出通道go readData(writeChan, exitChan)   // 启动readData协程go writeData(writeChan)   // 启动writeData协程for {v, ok := <-exitChan   // 接收退出通道值if ok {fmt.Println("完成:", v)   // 打印完成信息break   // 退出循环}}
}func writeData(writeChan chan int) {for i := 1; i <= 20; i++ {writeChan <- i   // 将i写入通道fmt.Println("写入数据~~:", i)   // 打印写入数据信息}close(writeChan)   // 关闭通道
}func readData(writeChan chan int, exitChan chan bool) {for v := range writeChan {fmt.Println("读取数据~~:", v)   // 打印读取数据信息}// 结束exitChan <- true   // 向退出通道发送完成信号close(exitChan)   // 关闭通道
}

二.协程案例-计算2000个数各个数的累加和

package mainimport ("fmt""sync"
)var (wg3 sync.WaitGroup // wg3用于等待PutData函数执行完成wg4 sync.WaitGroup // wg4用于等待SumUp函数执行完成
)func main() {numChan := make(chan int, 2000) // 创建一个缓冲大小为2000的整型通道wg3.Add(2000) // 将等待计数器设置为2000go PutData(numChan) // 启动PutData协程,向numChan通道写入数据wg3.Wait() // 等待PutData协程执行完成close(numChan) // 关闭numChan通道fmt.Println("num:", len(numChan)) // 打印numChan通道内的数据个数(应为2000)wg4.Add(2000) // 将等待计数器设置为2000resChan := make(chan map[int]int, 2000) // 创建一个缓冲大小为2000的映射整型到映射整型的通道for n := range numChan {go SumUp(n, resChan) // 启动SumUp协程,计算numChan中的每个数字的累加和并存储到resChan通道}wg4.Wait() // 等待所有SumUp协程执行完成close(resChan) // 关闭resChan通道fmt.Println("res:", len(resChan)) // 打印resChan通道内的数据个数(应为2000)for res := range resChan {for key, val := range res {fmt.Printf("res[%v]=%v\n", key, val) // 遍历输出resChan通道中的结果}}
}// SumUp 计算累加和
func SumUp(n int, resChan chan map[int]int) {sumMap := make(map[int]int) // 创建一个整型到整型的映射res := 0 // 初始化res为0for i := 1; i <= n; i++ {res += i // 将i累加到res上}sumMap[n] = res // 将res存储到sumMap中对应的n位置resChan <- sumMap // 将sumMap发送到resChan通道defer wg4.Done() // 在协程结束时,将等待计数器减1
}func PutData(numChan chan int) {for i := 1; i <= 2000; i++ {numChan <- i // 将i发送到numChan通道wg3.Done() // 等待发送完成后,将等待计数器减1}
}

三.生产1000个数据保存文件,读取文件排序后另存文件

package mainimport ("bufio""fmt""io""math/rand""os""strconv""strings""sync""time"
)var (wg5 sync.WaitGroup // wg5用于等待所有goroutine完成
)// goroutine+channel实现写入文件和排序
func main() {wg5.Add(1000)        // 增加1000个等待的goroutinego writeDataToFile() // 启动写入数据到文件的goroutinewg5.Wait()           // 等待所有goroutine完成fmt.Println("文件写入完成!!!!!!!!!!")fmt.Println()fmt.Println("读取所写文件对其排序生成新的文件!!!!!!!")dataChan := make(chan int, 1000) // 创建一个容量为1000的整型通道readDataToChannel(dataChan)      // 启动读取数据到通道的goroutinesortToSave(dataChan)             // 对通道中的数据进行排序和保存
}// 将数据放入切片 对切片排序 再写入文件保存
func sortToSave(dataChan chan int) {dataSlice := make([]int, len(dataChan)) // 创建一个与通道长度相同的切片for i := 0; i < len(dataSlice); i++ {for data := range dataChan { // 从通道中接收数据dataSlice[i] = databreak}}fmt.Println(len(dataSlice)) // 打印切片长度, 为1000QuickSort(dataSlice)        // 使用快速排序fmt.Println("排序后:", dataSlice)file, err := os.OpenFile("d:/go-test/sortData.txt", os.O_WRONLY|os.O_TRUNC|os.O_APPEND|os.O_CREATE, 0666) // 打开或创建文件if err != nil {fmt.Println("open file err ", err)return}defer file.Close()              // 函数返回前关闭文件writer := bufio.NewWriter(file) // 创建写入器for i := 0; i < len(dataSlice); i++ {_, err := writer.WriteString(strconv.Itoa(dataSlice[i]) + ",") // 将切片中的数据写入文件if err != nil {fmt.Println("write file err ", err)break}}writer.Flush() // 刷新写入器fmt.Println("有序文件写入完成!!!!!")
}// 随机生产1000个数据写入文件
func writeDataToFile() {rand.Seed(time.Now().UnixNano())                                                                      // 使用当前时间作为随机数种子file, err := os.OpenFile("d:/go-test/data.txt", os.O_WRONLY|os.O_TRUNC|os.O_APPEND|os.O_CREATE, 0666) // 打开或创建文件if err != nil {fmt.Println("open file err ", err)return}defer file.Close() // 函数返回前关闭文件writer := bufio.NewWriter(file) // 创建写入器for i := 0; i < 1000; i++ {_, err := writer.WriteString(strconv.Itoa(rand.Intn(1000)+1) + ",") // 随机生成1000个数据并写入文件wg5.Done()                                                          // wg5计数减1if err != nil {fmt.Println("write file err ", err)break}}writer.Flush() // 刷新写入器
}// 从文件中读取数据到通道
func readDataToChannel(dataChan chan int) {file, err := os.Open("d:/go-test/data.txt") // 打开文件if err != nil {fmt.Println("open file err ", err)return}defer file.Close()              // 函数返回前关闭文件reader := bufio.NewReader(file) // 创建读取器for {dataStr, errRead := reader.ReadString(',') // 从文件中读取数据直到文件末尾或发生错误if errRead != nil {if errRead == io.EOF {fmt.Println("读取结束!!!!")} else {fmt.Println("读取错误:", errRead)}break}atoi, _ := strconv.Atoi(strings.Trim(dataStr, ",")) // 将字符串转换为整数dataChan <- atoi                                    // 将整数发送到通道}close(dataChan)                   // 在写入所有数据后关闭通道fmt.Println("长度:", len(dataChan)) // 打印通道长度, 为1000
}// QuickSort 快速排序
func QuickSort(arr []int) {// 结束条件if len(arr) < 2 {return}left, right := 0, len(arr)-1 // 定义分区点的左右指针pivot := right               // 将分区点设置为数组的最后一个元素for i := 0; i < len(arr); i++ {if arr[i] < arr[pivot] {arr[left], arr[i] = arr[i], arr[left] // 将较小的元素交换到左边left++}}arr[left], arr[right] = arr[right], arr[left] // 将分区点交换到中间QuickSort(arr[:left])                         // 对分区点左边的子数组进行递归排序QuickSort(arr[left+1:])                       // 对分区点右边的子数组进行递归排序
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跑通 yolov5-7.0 项目之训练自己的数据集

yolov5 一、yolov5 源码下载二、配置环境&#xff0c;跑通项目三、训练自己的数据集1、获取验证码数据2、标注图片&#xff0c;准备数据集3、开始训练自己的数据集1、train.py 训练数据集2、val.py 验证测试你的模型3、detect.py 正式用你的模型 四、遇到的报错、踩坑1、import…

电脑内存满了怎么清理内存?试试这6个方法~

内存越大&#xff0c;运行越快&#xff0c;程序之间的切换和响应也会更加流畅。但是随着时间的增加&#xff0c;还是堆积了越来越多的各种文件&#xff0c;导致内存不够用&#xff0c;下面就像大家介绍三种好用的清理内存的方法。 方法一&#xff1a;通过电脑系统自带的性能清理…

vim 编辑器如何同时注释多行以及将多行进行空格

当然可以&#xff0c;以下是我对您的文字进行润色后的版本&#xff1a; 一、场景 YAML文件对空格的要求非常严格&#xff0c;因此在修改YAML时&#xff0c;我们可能需要批量添加空格。 二、操作步骤 请注意&#xff1a;您的所有操作都将以第一行为基准。也就是说&#xff0…

QT+OSG/osgEarth编译之七十八:hdr+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_hdr)

目录 1、osgdb_hdr介绍 2、文件分析 3、pro文件 4、编译实践 1、osgdb_hdr介绍 通过osgdb_hdr,osg能方便地读取高动态范围图像文件,从而为三维场景渲染提供高动态范围图像的数据支撑。 HDR文件是以高动态范围 (HDR) 图像格式保存的位图图像或数码照片。这种格…

OpenCV-Python(39):Meanshift和Camshift算法

目标 学习了解Meanshift 和Camshift 算法在视频中找到并跟踪目标 Meanshift 原理 Meanshift算法是一种基于密度的聚类算法&#xff0c;用于将数据点划分为不同的类别。它的原理是通过数据点的密度分布来确定聚类中心&#xff0c;然后将数据点移动到离其最近的聚类中心&#…

【代码随想录07】344.反转字符串 541. 反转字符串II 05.替换空格 151.翻转字符串里的单词 55. 右旋转字符串

目录 344. 反转字符串题目描述做题思路参考代码 541. 反转字符串 II题目描述参考代码 05. 替换数字题目描述参考代码 151. 反转字符串中的单词题目描述参考代码 55. 右旋转字符串题目描述参考代码 344. 反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反…

OOM分析与解决

一、分类 OOM:java.lang.OutOfMemoryError 1.1 堆内存溢出 堆内存&#xff08;Heap Space&#xff09;没有足够空间存放新创建的对象 java.lang.OutOfMemoryError:Javaheap space原因&#xff1a; 请求创建一个超大对象&#xff0c;通常是一个大数组。 超出预期的访问量/数…

C语言从入门到实战——动态内存管理

动态内存管理 前言一、 为什么要有动态内存分配二、 malloc和free2.1 malloc2.2 free 三、calloc和realloc3.1 calloc3.2 realloc 四、常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释放一块动态开…

用于自动驾驶最优间距选择和速度规划的多配置二次规划(MPQP) 论文阅读

论文链接&#xff1a;https://arxiv.org/pdf/2401.06305.pdf 论文题目&#xff1a;用于自动驾驶最优间距选择和速度规划的多配置二次规划&#xff08;MPQP&#xff09; 1 摘要 本文介绍了用于自动驾驶最优间距选择和速度规划的多配置二次规划&#xff08;MPQP&#xff09;。…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(6)解散部门

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;4&#xff09;&#xff08;5&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能…

MATLAB对话框与菜单设计实验

本文MATLAB源码&#xff0c;下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740733 一、实验目的 1.掌握建立控件对象的方法。 2.掌握对话框设计方法。 3.掌握菜单设计方法。 二、实验内容 建立如下图所示的菜单。菜单…

15.云原生之k8s容灾与恢复实战

云原生专栏大纲 文章目录 Velero与etcd介绍Velero与etcd备份应用场景Velero与etcd在k8s备份上的区别 Velero备份恢复流程备份工作流程Velero备份时&#xff0c;若k8s集群发送变化&#xff0c;会发发生情况&#xff1f;Velero 备份pv&#xff0c;pv中数据变化&#xff0c;会发发…

C# System.MissingMethodException

C#应用程序工程调用C#类库工程生成的动态链接库调试时报错&#xff1a; System.MissingMethodException HResult0xFFFFFFFF Message找不到方法…… 软件结构如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; usi…

uniapp实现微信小程序富文本之mp-html插件详解

uniapp实现微信小程序富文本之mp-html插件 1 文章背景1.1 正则表达式1.2 mp-html插件1.3 uniapp 2 过程详解2.1 下载mp-html插件2.2 项目中引入mp-html2.3 引入正则规范图片自适应2.4 效果展示 3 全部代码 1 文章背景 1.1 正则表达式 正则表达式&#xff0c;又称规则表达式,&…

算法刷题——删除排序链表中的重复元素(力扣)

文章目录 题目描述我的解法思路结果分析 官方题解分析 查漏补缺更新日期参考来源 题目描述 传送门 删除排序链表中的重复元素&#xff1a;给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&…

【CA】《Coordinate Attention for Efficient Mobile Network Design》

CVPR-2021 github&#xff1a;https://github.com/Andrew-Qibin/CoordAttention 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Ablation Studies5.3 Comparison with Other Methods5.4 …

Python的流程控制语句,while循环和嵌套、for循环、break和continue、冒泡排序

流程控制语句是用于控制程序的执行顺序的语句。在Python中&#xff0c;主要有while循环和嵌套、for循环、break和continue语句、冒泡排序等。 while循环和嵌套&#xff1a; while循环用于多次执行一段代码&#xff0c;直到条件不再满足为止。嵌套是将一个while循环放在另一个wh…

【华为 ICT HCIA eNSP 习题汇总】——题目集2

1、交换机某个端口配置信息如下&#xff0c;则此端口的PVID为&#xff08;&#xff09;。 A、100 B、2 C、4 D、1 # interface GigabitEthernet0/0/1 port hybrid tagged vlan 2 to 3 100 port hybrid unatgged vlan 4 6 #考点&#xff1a;VLAN&#xff08;虚拟局域网&#xff…

josef约瑟 三相电压继电器 WY-35A4 100V DC220V 导轨安装

三相 WY-35A4电压继电器&#xff1b;WY-35B4电压继电器&#xff1b;WY-35C4电压继电器&#xff1b;WY-31A4电压继电器&#xff1b;WY-31B4电压继电器&#xff1b; WY-31C4电压继电器&#xff1b;JY-45A4电压继电器&#xff1b;JY-45B4电压继电器&#xff1b;JY-45C4电压继电器…

Tortoise-orm 使用 (一) 创建表

项目基于Vue3.0, FastAPI的模板管理系统&#xff0c;从网上找了各种资源去实践&#xff0c;现在将总结发出来&#xff0c;分享给大家&#xff0c;希望帮助大家少走些弯路。 准备工作 # tortoise-orm pip install tortoise-orm # MySQL pip install tortoise-orm[asyncmy] # 迁…