函數與 goroutine 在 go 語言中通過以下機制交互:通道(channel):在 goroutine 之間安全交換數據管道(pipe):用于與外部進程通信
Go 語言中函數與 Goroutine 交互的機制
Goroutine 簡介
Goroutine 是輕量級線程,允許 Go 程序并行執行代碼。它由 Go Runtime 管理,用于并行處理任務而無需手動創建和管理線程。
函數與 Goroutine 的交互
Go 語言中函數與 Goroutine 的交互是通過以下機制實現的:
通道 (Channel):一種用于在 Goroutine 之間安全地交換數據的通信機制。它是一個類型化的隊列,發送方將數據寫入通道,而接收方從中讀取數據。
管道 (Pipe):一種特殊類型的通道,旨在與命令行工具或其他外部進程通信。
實戰案例:并行求和
為了演示函數與 Goroutine 交互,我們創建一個簡單的并行求和程序:
package main import ( "fmt" "math/rand" "sync" "time" ) const numIterations = 1000000 func main() { sum := 0 // 初始化互斥鎖以保護并發的 sum 變量 lock := &sync.Mutex{} // 創建一個通道 c := make(chan int) // 創建 Goroutine 并發計算和并將結果發送到通道 for i := 0; i < numIterations; i++ { go func(num int) { rand.Seed(time.Now().UnixNano()) time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond) lock.Lock() defer lock.Unlock() sum += num c <- num }(i) } // 從通道接收數據并打印進度條 for i := 0; i < numIterations; i++ { <-c fmt.Printf("\rProgress: %f%", float64(i)/float64(numIterations)*100) } // 等待所有 Goroutine 完成 time.Sleep(time.Second) fmt.Println("\nFinal sum:", sum) }
登錄后復制
在這個程序中,我們使用管道和互斥鎖來實現函數與 Goroutine 之間的交互:
互斥鎖保護并發訪問的變量 sum
,以確保數據完整性。
Goroutine 將求和結果發送到管道。
主函數從管道中讀取結果并打印進度條。
通過這種機制,Goroutine 可以并發執行求和任務,而主函數可以跟蹤進度并收集最終結果。