首页 > 其他分享 >探索 Go 的 Fan-Out/Fan-In 模式:让并发更 easy

探索 Go 的 Fan-Out/Fan-In 模式:让并发更 easy

时间:2024-03-30 11:13:54浏览次数:20  
标签:goroutine 模式 并发 Fan easy Go Out

探索 Go 的 Fan-Out/Fan-In 模式:让并发更 easy

原创 Go Official Blog Go Official Blog 2024-03-29 21:03 中国香港 听全文

学习如何利用Go语言的并发性能,使用扇出/扇入模式。探索这种模式如何在 Go 应用程序中简化复杂的并发任务。

Introduction

并发在 Go 中可以是提高程序性能和效率的强大工具。然而,有效管理 goroutine 和 channel 有时可能会有挑战,特别是在复杂的情况下。这就是扇出/扇入模式发挥作用的地方,它使得在 Go 中进行并发更加容易和可维护。

在本文中,我们将探讨扇出/扇入模式,理解其工作原理,并看到如何在 Go 应用程序中使用它的实际示例。

Fan-Out/Fan-In 模式是什么?

扇出/扇入模式是并发编程中常用的设计模式,特别是在 Go 语言中。它包括两个阶段:

  1. 扇出阶段,在这个阶段,单个 goroutine 将任务广播给多个工作 goroutine;
  2. 扇入阶段,在这个阶段,这些工作 goroutine 的结果被聚合到一个单一的通道中。

为什么要使用  Fan-Out/Fan-In 模式

扇出/扇入模式通过将复杂的并发任务分解成较小、可管理的部分,简化了任务。它提供了一种结构化的方式来在多个 goroutine 之间分配工作,并高效地收集结果。当有大量任务需要同时执行,并希望确保结果正确聚合时,这种模式尤其有用。

Fan-Out 阶段: 分发 Tasks

在扇出阶段,一个单独的 goroutine(即“主节点”)负责将任务分配给一组工作 goroutine。每个工作 goroutine 并发地处理一部分任务。

以下是Go语言中扇出阶段的示例:

package main

import (
 "fmt"
 "sync"
 "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
 for job := range jobs {
  fmt.Printf("Worker %d processing job %d\n", id, job)
  // Simulate some work
  time.Sleep(time.Millisecond * 500)
  results <- job * 2 // Send the result to the results channel
 }
}

func main() {
 const numJobs = 10
 const numWorkers = 3

 jobs := make(chan int, numJobs)
 results := make(chan int, numJobs)

 var wg sync.WaitGroup

 // Start workers
 for i := 1; i <= numWorkers; i++ {
  wg.Add(1)
  go func(id int) {
   defer wg.Done()
   worker(id, jobs, results)
  }(i)
 }

 // Send jobs to workers
 for j := 1; j <= numJobs; j++ {
  jobs <- j
 }
 close(jobs)

 // Collect results from workers
 go func() {
  wg.Wait()
  close(results)
 }()

 // Print results
 for r := range results {
  fmt.Printf("Result: %d\n", r)
 }
}

Fan-In 阶段: 收集并处理结果

在 worker 完成任务后,Fan-In 阶段会从所有的 worker 那里收集结果,并将它们汇总到一个 channel 中。这使得就可以轻松地处理合并的结果。

Conclusion

Fan-Out/Fan-In 模式是 Go 中管理并发的有效率工具,它以结构化和高效的方式进行操作。通过将复杂任务划分为更小的单元并汇总结果,你可以充分利用 Go 的并发特性。  在这篇文章中,我们探讨了Fan-Out/Fan-In 模式的基础知识,并看到了它如何应用于实际场景。将这种模式纳入你的 Go 应用程序可以使代码更易读、更易维护,并提高性能。

 

golang17 Golang27 Go blog 合集27 golang · 目录 上一篇理解 Go 的 FileMode:文件系统操作和权限 阅读 500 Go Official Blog ​   喜欢此内容的人还喜欢   理解 Go 的 FileMode:文件系统操作和权限     我看过的号 Go Official Blog 不看的原因   k8s中的11运维开发方向是哪些 如果快速提升k8s开发能力     我看过的号 小乙运维杂货铺 不看的原因   Go实验室:每周一更|利用embed引入静态文件     我看过的号 短腿子猿 不看的原因   关注公众号后可以给作者发消息              

人划线

 

标签:goroutine,模式,并发,Fan,easy,Go,Out
From: https://www.cnblogs.com/cheyunhua/p/18105223

相关文章

  • 如何订阅OnlyFans教程?如何在OnlyFans上面支付?
    1.引言什么是OnlyFans:OnlyFans是一种内容订阅服务,成立于2016年,允许内容创作者从用户那里获得资金,用户需要支付订阅费用才能查看他们的内容。它在多个领域受到欢迎,包括音乐、健身、摄影,以及成人内容创作。目的:本教程旨在帮助大家如何在OnlyFans上进行订阅和支付,并提供详细指导......
  • Go标准库源码分析: atomic.AddInt64
    atomic.AddInt64介绍原理源码看不到源码解释个勾八原理源码里只有函数doc,但是没有函数实现,但是有一段注释//AddInt64atomicallyaddsdeltato*addrandreturnsthenewvalue.//Considerusingthemoreergonomicandlesserror-prone[Int64.Add]instead/......
  • golang: 分析查看汇编代码
    golang:分析查看汇编代码查看可执行文件可视化注意:linux用户需要额外运行goinstall--tagsnowaylandloov.dev/lensm@main​下载lensm:goinstallloov.dev/lensm@main运行lensm​:lensm.\main.exe​效果:​​Gobuild​gobuild-gcflags-S.\main.go​......
  • clean maven工程报错: Cannot find JRE '1.8 (1)'. You can specify JRE to run maven
    在双击Maven的clean时,报错:CannotfindJRE'1.8(1)'.YoucanspecifyJREtorunmavengoalsinSettings原因可能是自己之前下载的是JDK17,并且IDEA认为该JDK为默认JDK,而我的Maven项目设置使用的是JDK8,因此报错。解决方案如下:点击File-settingBuild,Execution,Deploy......
  • 解决ubuntu22.04的ssh问题--userauth_pubkey: key type ssh-rsa not in PubkeyAccepte
    问题在我新安装了一台ubuntu22.04的服务器时,配置远程服务器正常情况下,只要把握本机的公钥写到被远程主机对应用户的.ssh/authorized_keys文件中就好了但是,今天发现,虽然设置进去了,但是远程还是提示需要密码但是并不是所有的主机是这样的,同样是ubuntu22.04的服务器还是能够免......
  • golang学习路线
    golang学习路线学习Golang的路线可以分为以下几个阶段:基础语法:了解Golang的基本语法结构,包括变量声明、控制流、函数、指针等。数据类型:熟悉Golang的基本数据类型,如整型、浮点型、字符串、数组、切片、Map等。并发编程:学习Golang的并发编程特性,包括goroutines、channels和互斥......
  • golang 读取文件内容,清空文件内容,把读取的内容写入到文件里
    packagemainimport( "encoding/json" "fmt" "io" "log" "os")typePvRelationListstruct{ Item[]PvRelationInfo`json:"item"`}typePvRelationInfostruct{ PodNamestring`json:"p......
  • 使用easyPoi的动态列导出
    项目背景:有一个导出excel的需求,要求导出部分固定列和部分动态列,固定列使用字段写死,动态列使用list集合存放成果展示:思路:简单说就是一个行转列的处理1.使用easypoi的注解方式进行导出,固定列部分使用@Excel标注2.动态列使用一个List集合,用@ExcelCollection标注,里面的......
  • The following export control compliance notifications have been delivered to cry
    https://www.linuxfoundation.org/legal/export Thefollowingexportcontrolcompliancenotificationshavebeendeliveredtocrypt@[email protected]. ========================================......
  • Google人才选拔的独特视角
    Google人才选拔的独特视角独特的人才选拔标准Google作为全球最大的搜索引擎公司,拥有无数优秀的人才。他们的选拔标准与众不同,有着自己独特的人才观。重视多元化的背景Google相信人才的多元化背景能够给公司带来不同的思考角度和创新思维。他们认为,一个团队中的成员应该拥有......