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语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对