首頁 >後端開發 >Golang >Go 中的扇入扇出並發模式:綜合指南

Go 中的扇入扇出並發模式:綜合指南

Patricia Arquette
Patricia Arquette原創
2025-01-07 22:24:41551瀏覽

⚠️ 這個系列如何進行?

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="https://img.php.cn/upload/article/000/000/000/173625991579012.png" 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="https://img.php.cn/upload/article/000/000/000/173625991836275.png" 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="https://img.php.cn/upload/article/000/000/000/173625990185651.png" alt="Go 中的扇入扇出並發模式:綜合指南" loading="lazy">
    </div>
<div>
      <h2>理解和視覺化 Golang 中的 Goroutines 和 Channel</h2>
      <h3>Souvik Kar Mahapatra ・ 2024 年 12 月 20 日</h3>
      <div>
        #去
        #程式設計
        #學習
        #教程
      </div>
    </div>
  
</div>



<p>請繼續關注更多 Go 並發模式! ? </p>

<p><img src="https://img.php.cn/upload/article/000/000/000/173625992371812.gif" alt="Go 中的扇入扇出並發模式:綜合指南" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>


          

            
  

            
        

以上是Go 中的扇入扇出並發模式:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn