Go协程池gopool源码解析
package main
import (
"fmt"
"sync"
)
// Pool 是一个协程池的简单实现。
type Pool struct {
workers int
jobs chan func()
wg sync.WaitGroup
}
// NewPool 创建一个新的协程池。
func NewPool(workers int) *Pool {
pool := &Pool{
workers: workers,
jobs: make(chan func()),
}
pool.startWorkers()
return pool
}
// startWorkers 启动工作协程。
func (p *Pool) startWorkers() {
for i := 0; i < p.workers; i++ {
go func() {
for job := range p.jobs {
job()
}
}()
}
}
// Do 向池中添加一个任务。
func (p *Pool) Do(job func()) {
p.wg.Add(1)
go func() {
defer p.wg.Done()
p.jobs <- job
}()
}
// Wait 等待所有任务完成。
func (p *Pool) Wait() {
p.wg.Wait()
close(p.jobs)
}
func main() {
pool := NewPool(10)
for i := 0; i < 100; i++ {
pool.Do(func() {
fmt.Println("处理任务:", i)
})
}
pool.Wait()
fmt.Println("所有任务已完成")
}
这段代码定义了一个简单的协程池,可以用来并发执行任务。它创建了一个固定大小的worker池,并提供了任务的提交和等待所有任务完成的机制。这是学习并发编程和理解协程池概念的一个很好的起点。
评论已关闭