在Go语言中,可以使用goroutine和channel来控制并发数量。可以通过创建一个有限大小的goroutine池来限制并发数量,例如可以使用带有缓冲区的channel来实现。当有任务需要进行并发处理时,首先将任务发送到channel中,然后从channel中取出任务并启动goroutine进行处理。在goroutine处理完任务后,再从channel中获取下一个任务继续处理,这样就可以有效地控制并发数量。
以下是一个示例代码:
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Printf("Worker %d started job %d\n", id, job)
time.Sleep(time.Second)
fmt.Printf("Worker %d finished job %d\n", id, job)
results <- job * 2
}
}
func main() {
numJobs := 10
numWorkers := 3
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
for i := 1; i <= numWorkers; i++ {
go worker(i, jobs, results)
}
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
for r := 1; r <= numJobs; r++ {
<-results
}
}
在这个示例中,我们创建了3个worker goroutine来处理任务,并发数量被限制在3个。我们将10个任务发送到jobs channel中,worker从jobs channel中取出任务进行处理,处理完后将结果发送到results channel中。最后我们从results channel中取出所有结果,确保所有任务都被处理完毕。