golang 如何控制并发的数量
时间: 2023-07-26 12:40:41 浏览: 46
在 Golang 中可以通过 goroutine 和 channel 实现并发控制。
1. 使用 Goroutine
可以使用 `go` 关键字创建 goroutine,但是如果创建太多的 goroutine,会导致系统资源的浪费,因此我们可以使用 `sync.WaitGroup` 来控制 goroutine 数量。
示例代码:
```go
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
fmt.Printf("Worker %d starting\n", id)
// 模拟工作
for i := 0; i < 1000000000; i++ {
}
fmt.Printf("Worker %d done\n", id)
wg.Done()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All workers done")
}
```
在上面的示例中,我们创建了 10 个 worker,但是每次只有 3 个 worker 在并发执行,其他的 worker 在等待。
2. 使用 Channel
我们可以使用 channel 来限制 goroutine 的数量,当 channel 中的值满了时,新的 goroutine 就会被阻塞,直到有空余的位置。
示例代码:
```go
package main
import (
"fmt"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("Worker %d starting job %d\n", id, j)
// 模拟工作
for i := 0; i < 1000000000; i++ {
}
fmt.Printf("Worker %d finished job %d\n", id, j)
results <- j * 2
}
}
func main() {
const numJobs = 10
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 创建 3 个 worker
for i := 0; i < 3; i++ {
go worker(i, jobs, results)
}
// 添加任务
for j := 0; j < numJobs; j++ {
jobs <- j
}
close(jobs)
// 获取结果
for a := 0; a < numJobs; a++ {
<-results
}
}
```
在上面的示例中,我们创建了 3 个 worker,但是只有 10 个任务,因此可以使用一个大小为 10 的 channel 来限制并发数量。每个 worker 从 jobs channel 中获取任务,完成后将结果发送到 results channel 中。最后从 results channel 中获取所有的结果。