Golang并发模型-Pipeline模型、Fan-in Fan-out模型

这段时间由于项目的需要,本人正在研究关于如何优雅的进行go的并发,以下是结合资料和视频的结果,文末会给出参考资料

Go语言的并发模型主要通过goroutine和channel实现,通过这个我们可以更有效地使用IO和CPU

这里我们围绕生成一个随机数并且返回他的平方数的场景来讲解

Generator模式

这里我们设置两个函数,一个是生成随机数,一个是生成平方数

func gen(nums ...int) <-chan int {out := make(chan int)go func() {for _, n := range nums {out <- n}close(out)}()return out
}func sq(in <-chan int) <-chan int {out := make(chan int)go func() {for n := range in {out <- n * n}close(out)}()return out
}

这就是generator模型,将每个并发阶段分开执行,最后汇总到一起

Pipeline模式

顾名思义,就是像一个管道一样联通在一起,从上面流通到下面,此处有一张图,可以更好的说明关系

be75792f60b14c4fbf706bb9564db185.png

 

我们通过channel来传递数据,把功能细分化,从生成一个数到处理一个数最后再到输出,这便是Pipeline模型。在特殊情况下,比如说channel是无缓冲的,那这又是一个同步的函数,只有前一个函数处理了才能到后面一个函数,特别像一个流水线,但是有很多工人,大家都在争相处理着数据

然后我们在main函数里面把他联通起来:

func main() {// 设置pipeline。c := gen(2, 3)out := sq(c)// 消费输出。fmt.Println(<-out)  // 输出 4fmt.Println(<-out)  // 输出 9
}

甚至我们可以设置一个take函数,专门处理输出

func consumer(in <-chan int) {for result := range in {fmt.Println(result)}
}

Fan in Fan out 模型

Fan-in 是指将多个输入合并(多路复用)到一个单一的流中,或者将来自一个源的输入流式传输到多个管道。简单来说,这个模式可以被视为生产者和消费者架构,其中我们有多个生产者向单一消费者发送输入,或者单一生产者向多个消费者发送输入。

类似于这张图

dae760c709364e72a619ae398f87aa02.png 

Fan-out 是指从同一个channel读取的多个函数。这通常用于在一组工作器之间分配工作,以并行化CPU和I/O。例如,你可能有一个生成器函数,它有一个goroutine迭代一系列数字,并将每个数字发送到一个channel中。然后,生成器函数返回存储这些数字的channel。

在Go语言中,fan-in 和 fan-out 模式是处理并发任务时常用的设计模式。这些模式特别适用于可以分解为多个可以并行执行的小任务的耗时任务

下面是一个简单的fan-out和fan-in的例子:


// Fan-out
func gen(nums ...int) <-chan int {out := make(chan int)go func() {for _, n := range nums {out <- n}close(out)}()return out
}// Worker
func sq(in <-chan int) <-chan int {out := make(chan int)go func() {for n := range in {out <- n * n}close(out)}()return out
}// Fan-in
func merge(cs ...<-chan int) <-chan int {var wg sync.WaitGroupout := make(chan int)// Start an output goroutine for each input channel in cs.// output copies values from c to out until c is closed, then calls wg.Done.output := func(c <-chan int) {for n := range c {out <- n}wg.Done()}wg.Add(len(cs))for _, c := range cs {go output(c)}// Start a goroutine to close out once all the output goroutines are done.// This must start after the wg.Add call.go func() {wg.Wait()close(out)}()return out
}func main() {// Set up the pipeline.in := gen(2, 3)// Distribute the sq work across two goroutines that both read from in.c1 := sq(in)c2 := sq(in)

这个Fan-in的启动量我们可以通过CPU来评估。

参考资料

  1. Go Concurrency Patterns: Pipelines and cancellation:这篇文章来自Go官方博客,详细介绍了pipeline模型和如何处理失败情况。
  2. Concurrency in Go: A Practical Guide with Hands-On Examples:这篇文章提供了一系列实用的例子,帮助您理解Go中的并发。
  3. Go Language and AI: Pioneering Concurrent Programming and Analysis
  4. Concurrent Programming in Go 这篇较为简单

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

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

相关文章

学习Python第十五天:第一个程序python程序

第一个程序&#xff1a;ZIP文件口令破解机 编写ZIP文件口令破解机要从学习zipfile库的使用方法着手&#xff0c;打开pythn解释器&#xff0c;我们用help(zipfile)命令进一步了解这个库&#xff0c;并重点看一下zipfile类中的extractall()方法&#xff0c;这个类和这个方法对我…

蓝桥杯第八届c++大学B组详解

目录 1.购物单 2.等差素数列 3.承压计算 4.方格分割 5.日期问题 6.包子凑数 7.全球变暖 8.k倍区间 1.购物单 题目解析&#xff1a;就是将折扣字符串转化为数字&#xff0c;进行相加求和。 #include<iostream> #include<string> #include<cmath> usin…

基于jsp网上教师点评系统

基于jsp网上教师点评系统 关键词&#xff1a;教师点评 信息技术 JSP技术 系统实现 首页 评分规则 教室信息 后台首页 相关技术介绍 B/S架构 对于架构&#xff0c;听起来说我们可能比较陌生&#xff0c;但对于通俗的语法讲。他的访问方式是通过网址还是说通过点图标这…

垄断与商品化背景下的网络安全三大整合策略

我国的网络安全产业已经发展了20余年&#xff0c;大大小小的企业几乎覆盖了网络安全的所有领域。随着安全需求的逐渐递增&#xff0c;安全产品也朝着平台化、规模化发展&#xff0c;这就倒逼着安全厂商需要整合越来越多的安全能力&#xff0c;并与其产品相融合。这个过程&#…

鸿蒙OS元服务开发:【(Stage模型)设置悬浮窗】

一、设置悬浮窗说明 悬浮窗可以在已有的任务基础上&#xff0c;创建一个始终在前台显示的窗口。即使创建悬浮窗的任务退至后台&#xff0c;悬浮窗仍然可以在前台显示。通常悬浮窗位于所有应用窗口之上&#xff1b;开发者可以创建悬浮窗&#xff0c;并对悬浮窗进行属性设置等操…

Kafka架构概述

Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…

用于AGV物流机器人的爱普生陀螺仪传感器XV7000系列

适用于AGV物流机器人的爱普生陀螺仪传感器XV7000系列:XV7001BB&#xff0c;XV7011BB。以前我们都知道XV7001BB&#xff0c;XV7011BB适用于扫地机器人&#xff0c;其实对于AGV物流机器人来说&#xff0c;XV7000系列生陀螺仪传感器也是其中重要一环。AGV机器人又叫做AGV搬运机器人…

概率论基础——拉格朗日乘数法

概率论基础——拉格朗日乘数法 概率论是机器学习和优化领域的重要基础之一&#xff0c;而拉格朗日乘数法与KKT条件是解决优化问题中约束条件的重要工具。本文将简单介绍拉格朗日乘数法的基本概念、应用以及如何用Python实现算法。 1. 基本概念 拉格朗日乘数法是一种用来求解…

element-ui tableData导出为xlsx文件

下载 npm i / yarn add file-saver、xlsx库 引入 import FileSaver from “file-saver”; import XLSX from “xlsx”; const simexport (data) > {// if (data.create_time && data.create_time.length > 0) {// data.start_time parseTime(data.create_tim…

2024水大会|【第二届智慧水环境管理与技术创新论坛】领衔专家刘炳义教授邀您聚首成都

2024年5月13日—15日中华环保联合会、福州大学、上海大学在四川省成都市联合举办“2024全国水科技大会暨技术装备成果展览会”。 大会以“加快形成新质生产力&#xff0c;增强水业发展新动能”为主题&#xff0c;由开幕式、院士论坛、主旨报告、高峰对话、主题峰会、专题论坛、…

monitor link 联合smart link配合应对复杂的网络

monitor link关键词&#xff1a;上行和下行端口&#xff0c;当上行端口异常&#xff0c;下行端口立即down掉&#xff0c;也就是一种联动机制 如果上行端口里面是smart link方式&#xff0c;则当主从端口都出问题时候&#xff0c;下行端口才会down掉 monitor link 配置步骤 1创…

macbook更改默认打开方式

1、mac上更改文件的默认打开方式&#xff0c;例如将.sql文件默认方式改成文本编辑 2、单击右键&#xff08;两指单机触摸板&#xff09;-> 显示简介 -> 打开方式 -> 选择新的默认打开方式 -> 全部更改 3、再次打开就设置完成了