搜索
首页后端开发GolangGo 中的管道并发模式:综合视觉指南

⚠️ 这个系列如何进行?

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

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

在上一篇文章中,我们探讨了生成器并发模式,它是 Go 其他并发模式的构建块。您可以在这里阅读:

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Go 中的生成器并发模式:视觉指南

Souvik Kar Mahapatra ・ 12 月 25 日

#去 #教程 #编程 #学习

现在,让我们看看这些原语如何组合起来形成解决现实世界问题的强大模式。

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

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

管道模式

管道就像工厂中的装配线,每个阶段对数据执行特定任务,并将结果传递到下一个阶段。

我们通过将 goroutine 与通道连接来构建管道,其中 每个 goroutine 代表一个阶段,用于接收数据、处理数据并将其发送到下一个阶段。

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

让我们实现一个简单的管道:

  1. 生成数字
  2. 将它们平方
  3. 打印结果
// Stage 1: Generate numbers
func generate(nums ...int) 


<blockquote>
<p>✏️快字节</p>

<p><u><strong></strong></u><br>


</p>
<p><u><strong>chan int 这表示双向通道。</strong></u><br>
chan int 类型的通道可用于发送和接收值。</p>
</blockquote>

<p>让我们继续想象一下上面的例子:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562621693417.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>

<p>在这里您可以看到管道的每个构建块都是遵循生成器模式的 goroutine。这意味着只要数据在任何步骤准备好,管道中的下一步就可以开始处理它,这与顺序处理不同。 </p>
<h3>
  
  
  管道中的错误处理
</h3>

<p>核心原则应该是:</p>

<ol>
<li>每个阶段都清楚地知道如何处理好的和坏的值</li>
<li>错误不会在管道中丢失</li>
<li>错误的值不会引起恐慌</li>
<li>错误消息包含有关出错原因的上下文</li>
<li>管道可以扩展更多阶段,并且它们都会一致地处理错误</li>
</ol>

<p>让我们用一些正确的错误处理来更新我们的代码。<br>
</p>
<pre class="brush:php;toolbar:false">type Result struct {
    Value int
    Err   error
}

func generateWithError(nums ...int) 

<h3>
  
  
  为什么使用管道模式?
</h3>

<p>让我们举个例子来更好地理解,我们有一个遵循管道模式的数据处理工作流程,如下所示。</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562621771746.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p><ol>
<li>管道中的每个阶段都是独立运行的,仅通过通道进行通信。这有几个好处:</li>
</ol>

<p>?每个阶段都可以独立开发、测试和修改<br>
?对一个阶段内部结构的更改不会影响其他阶段<br>
?轻松添加新阶段或修改现有阶段<br>
?明确的关注点分离</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562621851201.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>

<ol>
<li>管道模式自然地支持并行/并发处理。一旦数据可用,每个阶段都可以同时处理不同的数据。</li>
</ol>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562621927218.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>

<p>最好的部分是什么?我们可以运行每个阶段的多个实例(工作人员)以满足更多并发要求,如下所示:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562622047220.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>

<blockquote>
<p>??嘿,但这不是<strong>扇入和扇出并发模式</strong>吗?</p>
</blockquote>

<p>宾果游戏!很好的收获就在那里。它确实是一种扇出、扇入模式,它是管道模式的一种特定类型。我们将在下一篇文章中详细介绍它,所以不用担心;)</p>
<h3>
  
  
  现实世界用例
</h3>

<p><strong>在管道中处理图像</strong><br>
</p>
<pre class="brush:php;toolbar:false">// Stage 1: Generate numbers
func generate(nums ...int) 


<p>或者像日志处理管道一样复杂的东西</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562622173719.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>
<h3>
  
  
  管道扩展模式
</h3>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173562622294523.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>
<h4>
  
  
  <strong>水平缩放(扇出、扇入)</strong>
</h4>

<p>此模式非常适合 CPU 密集型操作,其中工作可以独立处理。管道将工作分配给多个工作人员,然后重新组合结果。这在以下情况下特别有效:</p>

<ol>
<li>处理是CPU密集型的(数据转换、计算)</li>
<li>可以独立处理任务</li>
<li>您有多个可用的 CPU 核心</li>
</ol>
<h4>
  
  
  <strong>缓冲管道</strong>
</h4>

<p>此模式有助于管理管道阶段之间的速度不匹配。缓冲器起到减震器的作用,允许快速阶段向前工作,而不会被较慢阶段阻挡。这在以下情况下很有用:</p><ol>
<li>不同阶段有不同的处理速度</li>
<li>您想要保持稳定的吞吐量</li>
<li>缓冲的内存使用是可以接受的</li>
<li>您需要处理突发处理</li>
</ol>
<h4>
  
  
  <strong>批量处理</strong>
</h4>

<p>此模式通过将多个项目分组为单个批次来优化 I/O 密集型操作。它不是一次处理一个项目,而是将它们分组并一起处理。这在以下情况下有效:</p>

<ol>
<li>您正在使用外部系统(数据库、API)</li>
<li>网络往返费用昂贵</li>
<li>该操作每个请求都有大量固定开销</li>
<li>您需要优化吞吐量而不是延迟</li>
</ol>

<blockquote>
<p>这些模式中的每一个都可以根据需要进行组合。例如,您可以使用水平扩展的批处理,其中多个工作人员每个处理一批项目。 <strong>关键是了解您的瓶颈并选择适当的模式来解决它们</strong>。</p>
</blockquote>

<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/173562620177807.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide">
    </div>
  
  
    <div>
      <h2 id="理解和可视化-Golang-中的-Goroutine-和-Channel">理解和可视化 Golang 中的 Goroutine 和 Channel</h2>
      <h3 id="Souvik-Kar-Mahapatra-月-日">Souvik Kar Mahapatra ・ 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/173562622776254.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide"></p>


          

            
  

            
        

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

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
学习GO String操纵:使用'字符串”软件包学习GO String操纵:使用'字符串”软件包May 09, 2025 am 12:07 AM

Go的"strings"包提供了丰富的功能,使字符串操作高效且简单。1)使用strings.Contains()检查子串。2)strings.Split()可用于解析数据,但需谨慎使用以避免性能问题。3)strings.Join()适用于格式化字符串,但对小数据集,循环使用 =更有效。4)对于大字符串,使用strings.Builder构建字符串更高效。

GO:使用标准'字符串”包的字符串操纵GO:使用标准'字符串”包的字符串操纵May 09, 2025 am 12:07 AM

Go语言使用"strings"包进行字符串操作。1)拼接字符串使用strings.Join函数。2)查找子串使用strings.Contains函数。3)替换字符串使用strings.Replace函数,这些函数高效且易用,适用于各种字符串处理任务。

使用GO的'字节”软件包掌握字节切片操作:实用指南使用GO的'字节”软件包掌握字节切片操作:实用指南May 09, 2025 am 12:02 AM

资助bytespackageingoisesential foreffited byteSemanipulation,uperingFunctionsLikeContains,index,andReplaceForsearchingangingAndModifyingBinaryData.itenHancesperformanceNandCoderAceAnibility,MakeitiTavitalToolToolToolToolToolToolToolToolToolForhandLingBinaryData,networkProtocols,networkProtocoLss,networkProtocols,andetFilei

学习GO二进制编码/解码:使用'编码/二进制”软件包学习GO二进制编码/解码:使用'编码/二进制”软件包May 08, 2025 am 12:13 AM

Go语言使用"encoding/binary"包进行二进制编码与解码。1)该包提供binary.Write和binary.Read函数,用于数据的写入和读取。2)需要注意选择正确的字节序(如BigEndian或LittleEndian)。3)数据对齐和错误处理也是关键,确保数据的正确性和性能。

GO:带有标准'字节”软件包的字节切​​片操作GO:带有标准'字节”软件包的字节切​​片操作May 08, 2025 am 12:09 AM

1)usebybytes.joinforconcatenatinges,2)bytes.bufferforincrementalWriter,3)bytes.indexorbytes.indexorbytes.indexbyteforsearching bytes.bytes.readereforrednerncretinging.isnchunk.ss.ind.inc.softes.4)

进行编码/二进制包:优化二进制操作的性能进行编码/二进制包:优化二进制操作的性能May 08, 2025 am 12:06 AM

theencoding/binarypackageingoiseforporptimizingBinaryBinaryOperationsDuetoitssupportforendiannessessandefficityDatahandling.toenhancePerformance:1)usebinary.nativeendiandiandiandiandiandiandiandian nessideendian toavoid avoidByteByteswapping.2)

Go Bytes软件包:简短的参考和提示Go Bytes软件包:简短的参考和提示May 08, 2025 am 12:05 AM

Go的bytes包主要用于高效处理字节切片。1)使用bytes.Buffer可以高效进行字符串拼接,避免不必要的内存分配。2)bytes.Equal函数用于快速比较字节切片。3)bytes.Index、bytes.Split和bytes.ReplaceAll函数可用于搜索和操作字节切片,但需注意性能问题。

Go Bytes软件包:字节切片操纵的实例Go Bytes软件包:字节切片操纵的实例May 08, 2025 am 12:01 AM

字节包提供了多种功能来高效处理字节切片。1)使用bytes.Contains检查字节序列。2)用bytes.Split分割字节切片。3)通过bytes.Replace替换字节序列。4)用bytes.Join连接多个字节切片。5)利用bytes.Buffer构建数据。6)结合bytes.Map进行错误处理和数据验证。

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

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

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)