iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Modern Web

就是個Go,我也可以啦!GOGO系列 第 19

2023鐵人賽Day 19 面向併發,Go 語言借鏡 CSP 模型的一場大師級的併發設計之旅

  • 分享至 

  • xImage
  •  

在上一篇,我們介紹的為什麼我們要用併發,並且基本簡介了併發模式是什麼,這一節我們要繼續簡介併發模式,讓我們徹底的熟悉他吧

Go 語言,一種在簡潔中蘊含著強大力量的語言,從其誕生之初就將 CSP 模型視為其靈魂。CSP 模型,一個在簡單性中隱藏著深邃智慧的模型,提供了一種獨特的方式來理解和應對併發的挑戰。在這個旅程中,我們將一起探索 Go 語言如何巧妙地利用 CSP 模型來創建清晰、優雅且強大的併發程序

Go始終推薦以CSP模型風格構建併發程序,這將提升程序邏輯的清晰度,大大降低併發設計的複雜性

再開始這些觀念前,我們要先釐清 行程、執行緒、協同行程

釐清 goroutines 就是 協程 這檔事

  • 行程(進程 process)
    • 行程是一個正在運行的程式實例,擁有自己的資源和記憶體空間
    • 我們看行程
      • 使用者通常關注行程的執行結果,而不深入其內部的運作機制或資源分配
      • 用者期望行程能夠順利運行並完成預定的任務,而不關心其背後的資源調度和管理過程
      • 我們來看下面這張圖,使用者看行程就是如此架構
      • https://ithelp.ithome.com.tw/upload/images/20231004/20150980ZDQmSgcI5d.png
  • 執行緒(線程 Thread)
    • 執行緒是作業系統進行CPU排班的最小單位,它被包含在行程內,是行程當中實際的運作單位
    • 一個行程可以含有多個執行緒也可以只有單一個執行緒
    • 並且這些執行緒彼此共用所屬行程的程式碼區塊
      • https://ithelp.ithome.com.tw/upload/images/20231004/20150980aeENnv7jsJ.png
  • 協同行程(協程 Coroutine)
    • 協程是一種輕量級的執行緒,它不由操作系統調度,而是由程式或者開發者控制
    • 程之間的切換不涉及系統調度和上下文切換的開銷,因此通常比傳統的多執行緒更加高效

從上面可以知道 行程 及 執行緒 是系統層級的操作 協同行程是程式級的操作,然而go就是利用協程的道理,達到併發的目的,然而Go的協程就是Goroutines,goroutines 需要的資源(例如,記憶體)通常較少,並且創建及切換的成本也較低

這樣子可以理解goroutines擔任什麼樣的角色嗎,goroutines就是協程,協程是一種程式層面的輕量級執行緒,不牽扯系統的操作,是程式層面!!!

CSP是什麼!Go又用了他什麼觀念

CSP 基本概念 - 郵箱系統

CSP模型就是一種讓不同的行程(或功能塊)通過發送和接收消息來協同工作的方法,並且在這個過程中,每個進程內部的操作都是有序和簡單的

  • 基本概念
    • Channels:
      • 通信的媒介,processes 通過 channels 來發送和接收消息
      • 比喻: 郵箱
        • 想像每個郵箱就像是一個通道(Channel),它是一個虛擬的傳遞消息的地方
        • 任何人(或在我們的情況下,任何進程)都可以將消息放入郵箱,而不需要知道誰將會收到它
    • Communication:
      • processes 通過通信來同步和交換資訊
      • 比喻:
        • 行程(Processes)可以將消息(例如一封信)放入郵箱,這個動作就像是發送一個消息。
        • 同時,其他行程可以從郵箱中取出消息,這就是接收消息的動作
        • 這個過程允許行程彼此通信,而不需要直接互相聯繫或知道對方的詳細信息
    • Processes:
      • CSP 模型中的基本單位,可以是一個任務、程式或系統,每個 process 執行一系列的事件
      • 比喻:
        • 行程不直接與其他行程互動,而是通過郵箱(Channel)來通信,這確保了它們的獨立性和可靠性

所以說 在CSP模型中,各個行程(Processes)透過郵箱(Channels)發送和接收消息來進行通信(Communication),而不需要知道或直接互動與其他行程。這種方法提供了一種靈活的協同工作方式,同時保持行程之間的解耦和獨立性

https://ithelp.ithome.com.tw/upload/images/20231004/20150980bC6h1Q0tao.png

Go 語言充分吸收了 CSP (Communicating Sequential Processes) 模型的精髓,並將其應用在語言的併發模型中。以下是 Go 語言如何運用 CSP 模型的一些核心觀念

Go 學習了什麼

  • Go 協程 (Goroutines) - 對應 CSP 中的 Processes
    • Goroutines 是 Go 語言中的輕量級執行緒,它們在功能上類似於 CSP 中的 processes
    • 一個 Go 程序可以同時運行多個 Goroutines,每個 Goroutine 執行一個函數或方法
    • Goroutines 運行在同一個執行緒內,並且共享記憶體空間,但通過 Channel 通信來避免共享記憶體的問題
      • 還記得嗎,在上面執行緒的圖裡面,同一個執行緒是同一個暫存器喔
  • Channel - 對應 CSP 中的 Channels
    • Channel 提供了一個管道,Goroutines 可以通過它來安全地發送和接收消息或數據,實現數據的同步傳輸

https://ithelp.ithome.com.tw/upload/images/20231004/20150980gS54zx41DR.png

這篇文章的目的是在希望讀者可以知悉 Goroutines 及 Channel 的角色,只有在知道他們扮演什麼樣的角色,你才能順著他們的思考模式進行程式設計,下一篇我們就會來實作了


上一篇
2023鐵人賽Day 18 Go 探索併發的魅力: 為何我們需要它以及如何入門
下一篇
2023鐵人賽Day 20 Go語言解鎖:實踐並發編程的策略與技巧
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言