“不要通過共享內存來通信”——深入理解Golang并發模型與CSP理論
Golang 在設計上另辟蹊徑,其并發哲學的核心信條是:“不要通過共享內存來通信,而要通過通信來共享內存。” (Do not communicate by sharing memory; instead, share memory by communicating.) 這一理念源自通信順序進程(Communicating Sequential Processes, CSP)理論。
共享消息模型
在共享消息模型(Show Message Model)中,線程或進程通過消息的發送與接收來實現通信與協同。這一模型的最大亮點在于,它能有效規避數據競爭及其他并發問題。原因在于,每個線程或進程都擁有獨立的內存空間,無需借助鎖或其他同步機制。
該模型的另一顯著特征是,消息的發送與接收是異步進行的。這意味著,一個線程或進程在發出消息后,無需等待接收方處理,即可繼續執行其他任務。這種異步特性極大地提升了并發性能,因為線程或進程不會因等待消息收發而陷入阻塞。
在該模型中,開發者的角色從“衛兵”轉變為“流程設計師”或“編舞家”。他的核心任務不再是保護數據,而是設計高效、無誤的數據流管道。通過精心編排數據在進程或線程間的流動順序,隱式地構建了操作間的因果關系。
程序的確定性,并非來自于對資源的加鎖,而是源于消息傳遞所建立的自然時序。這種模型將并發的復雜性從“管理狀態”轉移到了“編排通信”,使得并發邏輯更清晰,也更易于推理。

通信順序進程
通信順序進程(Communicating Sequential Process,CSP)是 Tony Hoare 在 1978 年提出的一種描述并發系統交互的模式,它正是Golang并發模型的靈感源泉。該模型強調通過通信來協調進程之間的交互,而不是共享數據。
CSP模型,包含進程(Process)?和通道(Channel)?兩個概念。
1)進程:進程是并發系統中的基本執行單元。每個進程都有自己的獨立執行流,并且通過通信進行交互。
? 2)通道:通道是進程之間進行通信的媒介。它可以看作是一個先進先出的隊列,進程可以向通道發送消息或從通道接收消息。
當進程向通道中發送消息,如果通道已滿,則發送操作會阻塞,直到通道有足夠的空間;當進程從通道中接收消息,如果通道為空,則接收操作會阻塞,直到通道中有消息可用。

CSP模型的關鍵特性是,進程的執行不會受到其他進程的直接影響,進程間的交互僅通過通道發送和接收消息來實現。這意味著進程的內部狀態對其他進程是不可見的,從而降低了并發編程的復雜性。
Golang通過輕量級的Goroutine和通信機制Channel,實現了CSP模型的核心思想,即通過消息傳遞而非共享內存實現并發控制。
1)Goroutine:Goroutine 是Golang的輕量級協程。創建一個新的 Goroutine 非常簡單,只需在函數調用前加上關鍵字 go。由于 Goroutine 的創建和切換成本非常低,所以在 Golang中可以創建大量的 Goroutine 來處理并發任務。
// 通過關鍵字go,創建一個Goroutine并執行異步函數
go func() {
// todo
}()
2)Channel:Channel提供了一種在 Goroutine 之間進行通信的機制。可以從一個Goroutine將數據發送到 Channel,然后另一個 Goroutine 中從 Channel 接收這個數據。
在Golang中,Goroutine代表并發的實體,它們各自獨立地執行任務;而Channel則用于在Goroutine之間傳遞消息,協調它們之間的工作。

未完待續很高興與你相遇!如果你喜歡本文內容,記得關注哦
本文來自博客園,作者:poemyang,轉載請注明原文鏈接:http://www.rzrgm.cn/poemyang/p/19139419
浙公網安備 33010602011771號