Go 協程透過通道(傳送和接收資料)和同步原語(管理對共享資源的存取)進行通訊。通道用於透過發送和接收操作在協程之間傳輸資料。同步原語包括互斥鎖(控制對共享資源的存取)、條件變數(等待條件滿足後繼續執行)和一次性訊號(確保操作只執行一次)。
什麼是協程?
協程是一種輕量級的線程,允許並發運行而不創建單獨的系統線程。它提供了並發程式設計的一種更有效率且資源節約的方式。
通訊機制
Go 協程可以透過以下兩種機制進行通訊:
通道
通道是一種同步通訊機制,它提供了兩個動作:
chan< ;- v
:將值v
傳送到通道。 :從通道接收值。
以下範例示範如何使用管道在兩個協程之間傳遞訊息:
package main import ( "fmt" "sync" ) func main() { // 创建一个无缓冲管道 message := make(chan string) // 启动一个发送协程 go func() { // 向通道发送消息 message <- "Hello from the sending goroutine!" }() // 启动一个接收协程 go func() { // 从通道接收消息 msg := <-message fmt.Println(msg) // 输出: Hello from the sending goroutine! }() // 等待协程完成 var wg sync.WaitGroup wg.Add(2) wg.Wait() }
同步原語
##同步原語可用於協調對共享資源的存取。以下是一些常用的同步原語:):
允許一次只有一個協程存取共用資源。 ):
用於等待某個條件滿足後再繼續執行。 ):
確保一個動作只執行一次。 package main import ( "fmt" "sync" ) var counter int var mu sync.Mutex func main() { // 启动多个协程同时对共享变量进行加法 var wg sync.WaitGroup for i := 0; i < 100; i++ { wg.Add(1) go func() { mu.Lock() counter++ mu.Unlock() wg.Done() }() } wg.Wait() fmt.Println(counter) // 输出: 100 }
以上是Golang協程的通訊機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!