Go 中的同步機制包括:通道:用於在 Goroutine 之間安全地傳遞數據,採用阻塞式發送和接收操作。互斥鎖:確保同一時間只有一個 Goroutine 可以存取共享資源。等待群組:追蹤正在等待完成的 Goroutine 數量,主 Goroutine 可透過該機制等待所有 Goroutine 完成再繼續執行。
Go 中函數和 Goroutine 的同步機制
在 Go 中,函數和 Goroutine 是並發的執行單元。為了確保它們之間的協調和資料完整性,需要使用同步機制。本文將介紹 Go 中常用的同步機制,並提供實戰案例。
通道 (Channel)
通道是一種用於在 Goroutine 之間安全地傳遞資料的緩衝區。通道的發送操作(ch )和接收操作(<code>v := )都是阻塞的。這意味著發送方只有在通道中有可用的空間時才會發送數據,而接收方只有在通道中有可用數據時才會接收數據。
實戰案例:使用通道在多個Goroutine 之間傳遞資料
package main import "fmt" func main() { // 创建一个带有缓冲区的通道(可以存储最多 10 个值) ch := make(chan int, 10) // 启动 5 个 Goroutine 向通道发送数据 for i := 0; i < 5; i++ { go func(i int) { ch <- i }(i) } // 从通道接收数据并打印结果 for i := 0; i < 5; i++ { fmt.Println(<-ch) } }
互斥鎖(Mutex)
互斥鎖是一種低階的同步機制,用來確保在同一時間只有一個Goroutine 可以存取共享資源。 sync.Mutex
類型提供了對互斥鎖的存取。
實戰案例:使用互斥鎖保護共享資源的存取
package main import ( "fmt" "sync" ) var ( mu sync.Mutex // 定义一个互斥锁 counter int // 共享资源 ) func main() { for i := 0; i < 100; i++ { go func(i int) { // 获取互斥锁 mu.Lock() defer mu.Unlock() // 释放互斥锁 // 访问共享资源 counter++ fmt.Printf("Goroutine %d: counter = %d\n", i, counter) }(i) } }
等待群組(WaitGroup)
#等待群組用於追蹤正在等待完成的Goroutine 的數量。當 Goroutine 完成時,它們會呼叫 Done
方法來減少等待群組計數。主 Goroutine可以透過呼叫 Wait
方法來阻塞,直到所有 Goroutine 完成。
實戰案例:使用等待群組等待所有Goroutine 完成
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup // 启动 5 个 Goroutine for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { fmt.Printf("Goroutine %d started\n", i) defer wg.Done() // Goroutine 完成时调用 Done }(i) } // 等待所有 Goroutine 完成 wg.Wait() fmt.Println("All Goroutines finished") }
理解同步機制至關重要
選擇正確的同步機制對於在並發環境中建立健全且正確的Go 程式至關重要。透過了解通道、互斥鎖和等待群組的使用,可以確保函數和 Goroutine 之間的協調和資料一致性。
以上是golang函數與goroutine的同步機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!