Go 中的協程是一種輕量級並發機制,允許在同一個進程中執行多個任務。它們共享進程記憶體空間,可以透過通道進行通訊。此外,文章還提供了以下內容:協程建立使用 go 關鍵字。通道透過 make 函數創建,可用於在協程之間傳遞值。實戰案例示範如何使用協程實現並行計算,透過 8 個協程計算 10 萬個質數。
Go 協程與並發模型
引言
##協程是Go語言中一種輕量級的並發機制,允許在同一進程中執行多個獨立的任務。本文將探討 Go 中的協程和並發模型,並提供實戰案例。協程
協程是 Go 語言中的並發執行單元,與執行緒類似,但更輕量級。協程共享同一個行程的記憶體空間,可以輕鬆共享資料。建立協程使用go 關鍵字,如下所示:go func() { // 协程体 }
通道
通道是Go 中的一種通訊機制,用於在協程之間傳遞值。通道可以單向或雙向,並且可以緩衝或無緩衝。建立通道使用 make 函數,如下所示:ch := make(chan int, 10)
實作案例:並行計算
讓我們使用協程實作並行計算的實戰案例。我們創建一個協程池,並在每個協程中計算一個大素數表:package main import ( "fmt" "math/rand" "time" ) const primeCount = 100000 // 计算素数 func isPrime(n int) bool { if n <= 1 { return false } for i := 2; i*i <= n; i++ { if n%i == 0 { return false } } return true } // 协程函数 func parallelPrimes(ch chan int) { for i := 0; i < primeCount; i++ { n := rand.Intn(100000) if isPrime(n) { ch <- n } } } func main() { // 创建通道和协程池 ch := make(chan int, primeCount) for i := 0; i < 8; i++ { go parallelPrimes(ch) } // 等待协程池完成 close(ch) start := time.Now() // 收集素数 for prime := range ch { fmt.Println(prime) } elapsed := time.Since(start) fmt.Printf("Elapsed time: %v\n", elapsed) }在這個案例中,我們創建了8 個協程,每個協程負責計算10 萬個素數。主協程負責收集素數並將它們列印到控制台上。
以上是Golang協程與並發模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!