在Golang中,可以通過控制goroutine的數量來控制最大并發數。
一種常見的方法是使用帶有緩沖的channel來限制并發數。通過創建一個具有固定緩沖大小的channel,可以限制同時運行的goroutine數量。當goroutine想要啟動時,它需要先從channel中獲取一個可用的令牌,如果沒有可用的令牌,則goroutine將被阻塞,直到有令牌可用為止。
以下是一個示例代碼:
package main
import "fmt"
func worker(id int, tokens chan struct{}) {
fmt.Printf("Worker %d started\n", id)
<-tokens // 獲取一個令牌
// 執行工作任務
fmt.Printf("Worker %d is working\n", id)
tokens <- struct{}{} // 釋放令牌
fmt.Printf("Worker %d finished\n", id)
}
func main() {
concurrency := 3 // 最大并發數
tokens := make(chan struct{}, concurrency) // 創建帶有固定緩沖大小的channel
// 啟動多個goroutine
for i := 0; i < 10; i++ {
tokens <- struct{}{} // 添加令牌到channel
go worker(i, tokens)
}
// 等待所有goroutine完成
for i := 0; i < concurrency; i++ {
tokens <- struct{}{}
}
}
在上述示例中,我們定義了一個帶有固定緩沖大小的channel tokens
。在main
函數中,我們啟動了10個goroutine,每個goroutine都會從tokens
channel中獲取一個令牌,然后執行工作任務。當任務完成后,goroutine會將令牌放回到channel中,以便其他goroutine可以獲取并執行任務。
通過調整concurrency
變量的值,您可以控制最大并發數。在上述示例中,我們將最大并發數設置為3,這意味著同一時間最多有3個goroutine可以運行。