golang 通过channel 控制gorounte 数量
时间: 2024-01-03 19:05:36 浏览: 33
是的,可以通过使用 channel 来控制并发 goroutine 的数量。具体的实现方法是,创建一个带缓冲的 channel,并在启动 goroutine 之前将一些数据发送到 channel 中。每当一个 goroutine 启动时,从 channel 中读取一个数据,如果 channel 已经空了,则 goroutine 会被阻塞,直到有新的数据进入 channel。
这个方法的原理是,通过限制 channel 中数据的数量,从而限制同时运行的 goroutine 数量。当 channel 已满时,新的 goroutine 会被阻塞,直到有其他 goroutine 执行完毕,从而腾出一个 channel 位置。
下面是一个示例代码,使用 channel 控制同时运行的 goroutine 数量:
```go
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "started job", j)
time.Sleep(time.Second)
fmt.Println("worker", id, "finished job", j)
results <- j * 2
}
}
func main() {
const numJobs = 10
const numWorkers = 3
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
for w := 1; w <= numWorkers; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
for a := 1; a <= numJobs; a++ {
<-results
}
}
```
在这个示例代码中,我们创建了一个 `jobs` channel 和一个 `results` channel,并启动了三个 goroutine 来处理 `jobs` channel 中的任务。在 `main` 函数中,我们向 `jobs` channel 中发送了 10 个任务,并在最后等待所有任务完成。
可以看到,在启动 goroutine 时,我们使用了带缓冲的 `jobs` channel,来限制同时运行的 goroutine 数量。当 `jobs` channel 已满时,新的 goroutine 会被阻塞,直到有其他 goroutine 执行完毕,从而腾出一个 channel 位置。