搜索
首页后端开发GolangGo 中的扇入扇出并发模式:综合指南

⚠️ 这个系列如何进行?

1。运行每个示例:不要只阅读代码。输入它,运行它,然后观察其行为。
2。实验和打破常规: 删除睡眠并看看会发生什么,更改通道缓冲区大小,修改 goroutine 计数。
打破东西会教你它们是如何工作的
3。关于行为的原因: 在运行修改后的代码之前,尝试预测结果。当您看到意外行为时,请停下来思考原因。挑战解释。
4。建立心理模型:每个可视化代表一个概念。尝试为修改后的代码绘制自己的图表。

Go 中的扇入扇出并发模式:综合指南

在上一篇文章中,我们探讨了管道并发模式,这是 扇入扇出 并发模式的构建块。您可以在这里阅读:

Go 中的扇入扇出并发模式:综合指南

Go 中的管道并发模式:综合视觉指南

Souvik Kar Mahapatra ・ 2024 年 12 月 29 日

#去 #教程 #编程 #建筑学

在这篇文章中,我们将介绍扇入和扇出模式,并尝试将它们可视化。因此,让我们做好准备,因为我们将亲手完成整个过程。

gear up

管道模式的演变

扇入扇出模式是管道模式的自然演变。虽然管道通过阶段顺序处理数据,但扇入扇出引入了并行处理功能。让我们想象一下这种演变是如何发生的:

evolution of pipeline concurrency pattern to fan in & fan out concurrency pattern

扇入扇出模式

想象一下繁忙时段的餐厅厨房。当订单进来时,多名厨师同时处理不同的菜肴(扇出)。当他们完成菜肴后,他们会聚集在服务柜台(扇入)。

Fan in Fan out concurrency pattern visualized

了解扇出

扇出是将工作分配给多个 goroutine 来并行处理数据。可以将其视为将一项大任务分成可以同时完成的较小部分。这是一个简单的例子:

func fanOut(input 

<h3>
  
  
  了解扇入
</h3>

<p>扇入与扇出相反 - 它将多个输入通道合并为一个通道。它就像一个漏斗,将所有工作人员的结果收集到一个流中。以下是我们的实现方式:<br>
</p>
<pre class="brush:php;toolbar:false">func fanIn(inputs ...


<p>让我们用一个并行处理数字的完整示例将它们放在一起:<br>
</p>
<pre class="brush:php;toolbar:false">func main() {
    // Create our input channel
    input := make(chan int)

    // Start sending numbers
    go func() {
        defer close(input)
        for i := 1; i 

<h2>
  
  
  为什么要使用扇入扇出模式?
</h2>

<p><strong>最佳资源利用</strong></p>

<p>该模式自然地在可用资源之间分配工作,这可以防止资源闲置,从而最大限度地提高吞吐量。<br>
</p>
<pre class="brush:php;toolbar:false">// Worker pool size adapts to system resources
numWorkers := runtime.NumCPU()
if numWorkers > maxWorkers {
    numWorkers = maxWorkers // Prevent over-allocation
}

通过并行化提高性能

  • 在顺序方法中,任务被一个接一个地处理,从而形成线性执行时间。如果每个任务需要 1 秒,那么处理 4 个任务需要 4 秒。
  • 这种并行处理将总执行时间减少到大约(总任务/工作人员数量)开销。在我们的示例中,有 4 个工作人员,我们在大约 1.2 秒而不是 4 秒内处理所有任务。
func fanOut(tasks []Task) {
    numWorkers := runtime.NumCPU() // Utilize all available CPU cores
    workers := make([]

<h2>
  
  
  现实世界的用例
</h2>

<p><strong>图像处理管道</strong></p>

<p>这就像我们的管道模式帖子的升级,我们需要更快地处理,并且每个进程都有专用的 go 例程:</p><p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625991579012.png?x-oss-process=image/resize,p_40" class="lazy" alt="Go 中的扇入扇出并发模式:综合指南 processing pipeline with fan in and fan out pattern" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>

<p><strong>网络抓取管道</strong><br>
网页抓取是扇入扇出的另一个完美用例。</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625991836275.png?x-oss-process=image/resize,p_40" class="lazy" alt="Web scraping is another perfect use case for fan-in fan-out" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>

<p>扇入扇出模式在这些场景中确实很出色,因为它:</p>

  • 通过 Go 的通道机制自动管理并发
  • 当处理速度慢于摄取时提供自然背压
  • 允许通过调整工人数量来轻松扩展
  • 通过隔离错误处理保持系统弹性

错误处理原则

快速失败:在管道的早期检测并处理错误

尝试在管道开始之前或开始时执行各种验证,以确保它不会失败,因为它可以防止将资源浪费在稍后会失败的无效工作上。这在扇入扇出模式中尤其重要,因为无效数据可能会阻塞工作人员或浪费并行处理能力。

但这并不是一个硬性规则,很大程度上取决于业务逻辑。以下是我们如何在现实世界的示例中实现它:

func fanOut(input 


<p>和<br>
</p>
<pre class="brush:php;toolbar:false">func fanIn(inputs ...


<p>注意!一个工人犯错误,另一个工人不会停止,他们继续处理,这给我们带来了第二个原则</p>
<h3>
  
  
  隔离故障:一名员工的错误不应影响其他员工
</h3>

<p>在并行处理系统中,一项糟糕的任务不应导致整个系统崩溃。每个工人都应该是独立的。<br>
</p>
<pre class="brush:php;toolbar:false">func main() {
    // Create our input channel
    input := make(chan int)

    // Start sending numbers
    go func() {
        defer close(input)
        for i := 1; i 

<h4>
  
  
  资源清理:正确清理错误
</h4>

<p>并行处理中的资源泄漏可能会迅速升级为系统范围的问题。适当的清理至关重要。</p>

<hr>

<p>我们对扇入和扇出模式的深入研究到此结束!接下来,我们将探讨<strong>工作池并发模式</strong>,我们在这篇文章中有所了解。就像我说的,我们正在逐步清除依赖关系,然后再进行下一个。</p>

<p>如果您发现这篇文章有帮助,有任何疑问,或者想分享您自己的这种模式的经验 - 我很乐意在下面的评论中听到您的意见。您的见解和问题有助于使这些解释对每个人来说都更好。</p>

<p>如果您错过了 Golang 的 goroutine 和通道的视觉指南,请在此处查看:</p>


<div>
  
    <div>
      <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625990185651.png?x-oss-process=image/resize,p_40" class="lazy" alt="Go 中的扇入扇出并发模式:综合指南" loading="lazy">
    </div>
<div>
      <h2 id="理解和可视化-Golang-中的-Goroutines-和-Channel">理解和可视化 Golang 中的 Goroutines 和 Channel</h2>
      <h3 id="Souvik-Kar-Mahapatra-年-月-日">Souvik Kar Mahapatra ・ 2024 年 12 月 20 日</h3>
      <div>
        #去
        #编程
        #学习
        #教程
      </div>
    </div>
  
</div>



<p>请继续关注更多 Go 并发模式! ?</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625992371812.gif?x-oss-process=image/resize,p_40" class="lazy" alt="Go 中的扇入扇出并发模式:综合指南" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>


          

            
  

            
        

以上是Go 中的扇入扇出并发模式:综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
测试代码依赖于INET功能的代码测试代码依赖于INET功能的代码May 03, 2025 am 12:20 AM

whentestinggocodewithinitfunctions,useexplicitseTupfunctionsorseParateTestFileSteSteTepteTementDippedDependendendencyOnInItfunctionsIdeFunctionSideFunctionsEffect.1)useexplicitsetupfunctionStocontrolglobalvaribalization.2)createSepEpontrolglobalvarialization

将GO的错误处理方法与其他语言进行比较将GO的错误处理方法与其他语言进行比较May 03, 2025 am 12:20 AM

go'serrorhandlingurturnserrorsasvalues,与Javaandpythonwhichuseexceptions.1)go'smethodensursexplitirorhanderling,propertingrobustcodebutincreasingverbosity.2)

设计有效界面的最佳实践设计有效界面的最佳实践May 03, 2025 am 12:18 AM

AnefactiveInterfaceoisminimal,clear and promotesloosecoupling.1)minimizeTheInterfaceForflexibility andeaseofimplementation.2)useInterInterfaceForeabStractionTosWapImplementations withCallingCallingCode.3)

集中式错误处理策略集中式错误处理策略May 03, 2025 am 12:17 AM

集中式错误处理在Go语言中可以提升代码的可读性和可维护性。其实现方式和优势包括:1.将错误处理逻辑从业务逻辑中分离,简化代码。2.通过集中处理错误,确保错误处理的一致性。3.使用defer和recover来捕获和处理panic,增强程序健壮性。

init in Init函数的替代方案,用于go中的包装初始化init in Init函数的替代方案,用于go中的包装初始化May 03, 2025 am 12:17 AM

Ingo,替代词Inivuntionsionializatializatializationfunctionsandsingletons.1)customInitializationfunctions hallowexpliticpliticpliticconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconcontirization curssementializatizatupsetups.2)单次固定元素限制ininconinconcurrent

与GO接口键入断言和类型开关与GO接口键入断言和类型开关May 02, 2025 am 12:20 AM

Gohandlesinterfacesandtypeassertionseffectively,enhancingcodeflexibilityandrobustness.1)Typeassertionsallowruntimetypechecking,asseenwiththeShapeinterfaceandCircletype.2)Typeswitcheshandlemultipletypesefficiently,usefulforvariousshapesimplementingthe

使用errors.is和错误。使用errors.is和错误。May 02, 2025 am 12:11 AM

Go语言的错误处理通过errors.Is和errors.As函数变得更加灵活和可读。1.errors.Is用于检查错误是否与指定错误相同,适用于错误链的处理。2.errors.As不仅能检查错误类型,还能将错误转换为具体类型,方便提取错误信息。使用这些函数可以简化错误处理逻辑,但需注意错误链的正确传递和避免过度依赖以防代码复杂化。

在GO中进行性能调整:优化您的应用程序在GO中进行性能调整:优化您的应用程序May 02, 2025 am 12:06 AM

tomakegoapplicationsRunfasterandMorefly,useProflingTools,leverageConCurrency,andManageMoryfectily.1)usepprofforcpuorforcpuandmemoryproflingtoidentifybottlenecks.2)upitizegorizegoroutizegoroutinesandchannelstoparalletaparelalyizetasksandimproverperformance.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器