函數(shù)與 goroutine 在 go 語言中通過以下機制交互:通道(channel):在 goroutine 之間安全交換數(shù)據(jù)管道(pipe):用于與外部進程通信
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):一種特殊類型的通道,旨在與命令行工具或其他外部進程通信。
實戰(zhàn)案例:并行求和
為了演示函數(shù)與 Goroutine 交互,我們創(chuàng)建一個簡單的并行求和程序:
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
const numIterations = 1000000
func main() {
sum := 0
// 初始化互斥鎖以保護并發(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ù)并打印進度條
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 之間的交互:
互斥鎖保護并發(fā)訪問的變量 sum,以確保數(shù)據(jù)完整性。
Goroutine 將求和結(jié)果發(fā)送到管道。
主函數(shù)從管道中讀取結(jié)果并打印進度條。
通過這種機制,Goroutine 可以并發(fā)執(zhí)行求和任務(wù),而主函數(shù)可以跟蹤進度并收集最終結(jié)果。






