动态

详情 返回 返回

“不要通過共享內存來通信”——深入理解Golang併發模型與CSP理論 - 动态 详情

Golang 在設計上另闢蹊徑,其併發哲學的核心信條是:“不要通過共享內存來通信,而要通過通信來共享內存。” (Do not communicate by sharing memory; instead, share memory by communicating.) 這一理念源自通信順序進程(Communicating Sequential Processes, CSP)理論。

共享消息模型
在共享消息模型(Show Message Model)中,線程或進程通過消息的發送與接收來實現通信與協同。這一模型的最大亮點在於,它能有效規避數據競爭及其他併發問題。原因在於,每個線程或進程都擁有獨立的內存空間,無需藉助鎖或其他同步機制。
該模型的另一顯著特徵是,消息的發送與接收是異步進行的。這意味着,一個線程或進程在發出消息後,無需等待接收方處理,即可繼續執行其他任務。這種異步特性極大地提升了併發性能,因為線程或進程不會因等待消息收發而陷入阻塞。
在該模型中,開發者的角色從“衞兵”轉變為“流程設計師”或“編舞家”。他的核心任務不再是保護數據,而是設計高效、無誤的數據流管道。通過精心編排數據在進程或線程間的流動順序,隱式地構建了操作間的因果關係。
程序的確定性,並非來自於對資源的加鎖,而是源於消息傳遞所建立的自然時序。這種模型將併發的複雜性從“管理狀態”轉移到了“編排通信”,使得併發邏輯更清晰,也更易於推理。
image

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

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之間傳遞消息,協調它們之間的工作。
image

未完待續很高興與你相遇!如果你喜歡本文內容,記得關注哦

Add a new 评论

Some HTML is okay.