函數(shù)與 goroutine 在 go 語言中通過以下機制交互:通道(channel):在 goroutine 之間安全交換數(shù)據(jù)管道(pipe):用于與外部進(jìn)程通信
Go 語言中函數(shù)與 Goroutine 交互的機制
Goroutine 簡介
Goroutine 是輕量級線程,允許 Go 程序并行執(zhí)行代碼。它由 Go Runtime 管理,用于并行處理任務(wù)而無需手動創(chuàng)建和管理線程。
函數(shù)與 Goroutine 的交互
Go 語言中函數(shù)與 Goroutine 的交互是通過以下機制實現(xiàn)的:
通道 (Channel):一種用于在 Goroutine 之間安全地交換數(shù)據(jù)的通信機制。它是一個類型化的隊列,發(fā)送方將數(shù)據(jù)寫入通道,而接收方從中讀取數(shù)據(jù)。
管道 (Pipe):一種特殊類型的通道,旨在與命令行工具或其他外部進(jìn)程通信。
實戰(zhàn)案例:并行求和
為了演示函數(shù)與 Goroutine 交互,我們創(chuàng)建一個簡單的并行求和程序:
package main import ( "fmt" "math/rand" "sync" "time" ) const numIterations = 1000000 func main() { sum := 0 // 初始化互斥鎖以保護(hù)并發(fā)的 sum 變量 lock := &sync.Mutex{} // 創(chuàng)建一個通道 c := make(chan int) // 創(chuàng)建 Goroutine 并發(fā)計算和并將結(jié)果發(fā)送到通道 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) } // 從通道接收數(shù)據(jù)并打印進(jìn)度條 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) }
登錄后復(fù)制
在這個程序中,我們使用管道和互斥鎖來實現(xiàn)函數(shù)與 Goroutine 之間的交互:
互斥鎖保護(hù)并發(fā)訪問的變量 sum
,以確保數(shù)據(jù)完整性。
Goroutine 將求和結(jié)果發(fā)送到管道。
主函數(shù)從管道中讀取結(jié)果并打印進(jìn)度條。
通過這種機制,Goroutine 可以并發(fā)執(zhí)行求和任務(wù),而主函數(shù)可以跟蹤進(jìn)度并收集最終結(jié)果。