Go 中的線程 Goroutine:同時運行恆定數量
Go 並發領域提供了大量關於等待指定數量的 Goroutine 完成的材料。然而,一個明顯的挑戰出現了:確保連續執行預定義數量的 goroutine,一個開始另一個結束。
考慮一個具有大量任務的場景,例如處理從 MySQL 檢索的資料資料庫。一種簡單的方法可能會啟動大量並行 goroutine,同時執行數十萬個任務。相反,所需的行為將並發運行的 goroutine 限制為固定數量(例如 20)。
這種受控並行模式稱為「有界並行性」。在 Go 中實現這種模式需要使用一個空結構通道作為訊號量,指示並發工作協程的最大數量。這是一個例子:
package main import "fmt" func main() { maxGoroutines := 10 guard := make(chan struct{}, maxGoroutines) for i := 0; i < 30; i++ { guard <- struct{}{} // blocks if guard channel is full go func(n int) { worker(n) <-guard // unlocks a slot in guard }(i) } } func worker(i int) { fmt.Println("doing work on", i) }
這個實作確保並發執行的 goroutine 數量不會超過指定數量。結果,當一個worker goroutine完成時,一個新的goroutine會立即啟動,從而維持所需的並發等級。
「Go並發模式」文章在「有限並行性」部分進一步探討了這個概念,提供了更深入的了解深入了解這一關鍵的並發技術。
以上是Go 中如何保持同時運行的 Goroutine 數量恆定?的詳細內容。更多資訊請關注PHP中文網其他相關文章!