在Go语言中如何解决并发任务的动态扩容问题?
当需要处理大量并发任务时,我们可能需要动态调整并发goroutine的数量以实现任务的高效处理。在Go语言中,可以使用goroutine和channel来实现并发编程,通过调整goroutine的数量,可以有效地控制并发任务的执行。
为了解决并发任务的动态扩容问题,我们可以使用一个goroutine池来管理并发goroutine的数量,并使用channel来进行任务的分发和结果的收集。下面是一个示例代码:
package main
import (
"fmt"
"sync"
"time"
)
type Pool struct {
queue chan Job
wg sync.WaitGroup
}
type Job struct {
id int
result string
}
func NewPool(maxWorkers int) *Pool {
pool := &Pool{
queue: make(chan Job),
}
for i := 0; i < maxWorkers; i++ {
go pool.worker(i)
}
return pool
}
func (p *Pool) worker(id int) {
for job := range p.queue {
fmt.Printf("Worker %d processing job %d
", id, job.id)
time.Sleep(time.Second) // 模拟任务耗时
job.result = fmt.Sprintf("Job %d processed by worker %d", job.id, id)
p.wg.Done()
}
}
func (p *Pool) AddJob(job Job) {
p.wg.Add(1)
p.queue