go并发模式之----阻塞/屏障模式

2024-03-01 10:52
文章标签 go 模式 并发 阻塞 屏障

本文主要是介绍go并发模式之----阻塞/屏障模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常见模式之一:阻塞/屏障模式

定义

顾名思义,就是阻塞等待所有goroutine,直到所有goroutine完成,聚合所有结果

使用场景

  • 多个网络请求,聚合结果

  • 大任务拆分成多个子任务,聚合结果

示例

package main
​
import ("fmt""time"
)
​
func task1(n int, res chan int) {time.Sleep(time.Millisecond * 30)res <- n * n
}
​
func task2(n int, res chan int) {time.Sleep(time.Millisecond * 10)res <- n + n
}
​
func task3(n int, res chan int) {time.Sleep(time.Millisecond * 20)res <- n / n
}
​
func main() {res := make(chan int, 3)defer close(res)go task1(2, res)go task2(3, res)go task3(4, res)var resArr []intfor i := 0; i < 3; i++ {resArr = append(resArr, <-res)}fmt.Println(resArr)
}

打印结果:

[6 1 4]

特殊使用

当我们并发请求,但是聚合结果时,需要顺序给出, 如上例,我们打印想要按照task1,task2,task3 依次给出

可以结合slice 和 和结果收集结构体 改写如下

package main
​
import ("fmt""time"
)
​
func task1(n int, res chan ResultMap) {time.Sleep(time.Millisecond * 30)res <- ResultMap{Key: "task1", Res: n * n,}
}
​
func task2(n int, res chan ResultMap) {time.Sleep(time.Millisecond * 10)res <- ResultMap{Key: "task2", Res: n + n,}
}
​
func task3(n int, res chan ResultMap) {time.Sleep(time.Millisecond * 20)res <- ResultMap{Key: "task3", Res: n / n,}
}
​
type ResultMap struct {Key stringRes int
}
​
func main() {taskList := []string{"task1", "task2", "task3"}res := make(chan ResultMap, 3)defer close(res)go task1(2, res)go task2(3, res)go task3(4, res)var resArr []intl := len(taskList)collectMap := make(map[string]int)for i := 0; i < l; i++ {tmp := <-rescollectMap[tmp.Key] = tmp.Res}for _, vv := range taskList {resArr = append(resArr, collectMap[vv])}fmt.Println(resArr)
}
​如果有更好的顺序收集结果方式,欢迎评论区指正

这篇关于go并发模式之----阻塞/屏障模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762208

相关文章

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性